当前位置:首页 > > 充电吧
[导读]SQL语句优化 3.1 优化SQL语句的一般步骤 3.1.1 通过show status命令了解各种SQL的执行频率。格式: mysql>show [session|global]sta

SQL语句优化 3.1 优化SQL语句的一般步骤 3.1.1 通过show status命令了解各种SQL的执行频率。

格式: mysql>show [session|global]status;
其中: session(默认)表示当前连接,global表示自数据库启动至今

mysql>show status;
mysql>show global  status;
mysql>show status like 'Com_%';
mysql>show global status like 'Com_%';

3.1.2 定位执行效率较低的SQL语句

explain select * from table where id=1000;
desc select * from table where id =1000;

3.1.3 通过EXPLAIN分析较低效SQL的执行计划


3.2 索引问题 索引是数据库优化中最常见也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题。 3.2.1 索引的存储分类 MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独一的文件;InnoDB存储引擎的表的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。 MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以只取name的前4个字符进行索引,这个特性可以大大缩小索引文件的大小,用户在设计表结构的时候也可以对文本列根据此特性进行灵活设计。

mysql>create index ind_company2_name on companny2(name(4));
    其中company表名ind_company2_name索引名

3.2.2MySQL如何使用索引 索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高select操作性能的最佳途径。 (一).使用索引

(1)对于创建的多列索引,只要查询的条件中用到最左边的列,索引一般就会被使用。如下创建一个复合索引。

mysql>create index ind_sales2_com_mon onsales2(company_id,moneys);
然后按company_id进行查询,发现使用到了复合索引
mysql>explain select * from sales2 where company_id=2006G
使用下面的查询就没有使用到复合索引。
mysql>explain select * from sales2 where moneys=1G

(2)使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如下:

(3)如果对大的文本进行搜索,使用全文索引而不使用like“%…%”. 如果列名是索引,使用column_name is null将使用索引。如下
(二).存在索引但不使用索引

(1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_part1均匀分布在1到100之间,查询时使用索引就不是很好

msyql>select * from table_name where key_part1>1 and key_part<90;

(2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。
(3)用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

从上面可以发现只有year列上面有索引。来看如下的执行计划。

(4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中这个索引也不会被MySQL采用。

(5)如果like是以%开始,可见虽然在name上面建有索引,但是由于条件中like的值的“%”在第一位了,那么MySQL也会采用这个索引。

(6)如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name列上有索引,但是也没有用到。

3.2.3查看索引使用情况 如果索引正在工作,Handler_read_key的值将很高,这个值带了一个行被索引值读的次数。 Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。
3.3 两个简单使用的优化方法 对于大多数开发人员来说,可能只希望掌握一些简单实用的优化方法,对于更多更复杂的优化,更倾向于交给专业DBA来做。 3.3.1定期分析表和检查表

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE  tal_name [,tbl_name] ...

本语句用于分析和存储表的关键字分析,分析的结果将可以使得系统得到准确的统计信息,使得SQL能够生成正确的执行计划。

分析表的语法如下:(检查一个或多个表是否有错误)

3.3.2定期优化表

优化表的语法格式:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tb1_name]

如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM,BDB和InnoDB表起作用。

3.4 常用SQL的优化 3.4.1 大批量插入数据

当用load命令导入数据的时候,适当设置可以提高导入的速度。

select name from tb1 infile into "/tmp/test.txt";
load data infile "/tmp/test.txt" into table tb1(name);

对于MyISAM存储引擎的表,可以通过以下方式快速的导入大量的数据。

ALTER TABLE tb1_name DISABLE KEYS
loading the data
ALTER TABLE tb1_name ENABLE KEYS

DISABLE KEYS 和 ENABLE KEYS 用来打开或关闭MyISAM表非唯一索引的更新,可以提高速度,
注意:对InnoDB表无效。
注意:对InnoDB表无效。

(2)关闭唯一性校验可以提高导入效率
在导入数据前先执行set unique_checks=0,关闭唯一性校验,在导入结束后执行set unique_checks=1,恢复唯一性校验,可以提高导入效率。

(1)针对InnoDB类型表数据导入的优化
因为InnoDB表的按照主键顺序保存的,所以将导入的数据主键的顺序排列,可以有效提高导入数据的效率。

(3)关闭自动提交可以提高导入效率
在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入结束后执行set autocommit=1,恢复自动提交,可以提高导入效率。

3.4.2 优化insert语句 尽量使用多个值表的insert语句,这样可以大大缩短客户与数据可的连接,关闭等损耗。 可以使用insert delayed (马上执行)语句得到更高的效率。 将索引文件和数据文件分别存放不同的磁盘上。 可以增加bulk_insert_buffer_size变量值的方法来提高速度,但是只对MyISAM表使用。 当从一个文件中装载一个表时,使用LOAD DATA INFILE。这个通常比使用很多insert语句快20倍。 3.4.3 优化group by语句 如果查询包含group by但用户想要避免排序结果的损耗,则可以使用order by null 来禁止排序:
如下没有使用order by null来禁止排序

如下使用order by null的效果:
3.4.4 优化order by语句

在某些情况中,MySQL可以使用一个索引来满足order by子句,而不需要额外的排序。Where条件和order by使用相同的索引,并且order by的顺序和索引顺序相同,并且order by的字段都是升序或者都是降序。

3.4.5 优化嵌套查询

下面是采用嵌套查询的效果(可以使用更有效的链接查询JOIN替代)。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭