1.嵌套查询的优化
当sql语句存在嵌套查询的时候,MySQL会生成临时表来存储子查询的结果数据,外层查询会从临时表中读取数据,待整个查询都完毕后,会删除临时表,整个过程比较耗时。此时可以使用join语句代替嵌套查询来提升数据库的查询性能。
2.OR条件语句的优化
当查询语句中的多个查询条件使用OR关键字进行连接时,只要OR连接的条件中有一个查询条件没有使用索引,MySQL就不会使用索引,而是对数据表进行全盘扫描。也就是说,使用OR连接多个查询条件,且每个查询条件必须使用索引时,MySQL才会使用索引查询数据。
3.order by 语句的优化
尽量保证ORDER BY子句的字段上存在索引
4.group by 语句的优化
使用group by 语句对数据进行分组的时候,默认会根据group by 子句的字段进行排序,如果group by 子句的字段上不存在索引时,会比较耗费性能。此时,可以指定order by null禁止排序来减少order by子句带来的性能消耗。
explain select * from goods group by t_category order by null \G;
5.分页查询的优化
MySQL中使用“limit m,n”语句实现分页查询,如果只是单纯地使用”limit m,n“语句的话,MySQL默认需要排序出数据表中的前m+n条数据,然后将前m条数据舍弃,返回第m+1到n+1的数据记录,这是非常耗费性能的。
a.回表查询优化分页
按照索引分页回表查询数据
explain select g1.id,g1.t_price from t_goods g1
->inner join(select id from t_goods order by t_upper_time limit 10000,10) g2
->on g1.id =g2.id \G;
注意:使用回表查询方式来优化分页,能够让MySQL扫描更少的分页数据,达到提升分页查询性能的目的,比直接使用limit m,n进行分区的性能更高。
6.插入数据的优化
向数据表中插入数据的时候,如果数据表中存在索引,唯一性校验的时,会影响插入数据的效率。优化数据的插入效率可以针对MYISAM数据表和InnoDB数据表分别进行优化。
a.myisam数据表插入数据的优点
向myisam数据表插入数据时,可以通过禁用索引,禁用唯一性检查,批量插入数据和批量导入数据的方式进行优化。
a1.禁用索引
插入大量数据的时候,数据表中存在索引会降低数据插入的性能,可以在插入数据前禁用索引,待和数据插入完毕后,再开启索引。
#禁用索引
alter table tab_01 disable keys;
#开启索引
alter table tab_01 enable keys;
a2.禁用唯一性检查
向数据表中插入数据时,对数据进行唯一性检查也会降低数据的插入性能,同样可以在插入数据前禁用对数据表中的唯一性检查,待插入的数据完成后,再开启。
#禁用唯一性检查
set unique_checks = 0;
#开启唯一性检查
set unique_checks = 1;
a3.禁用外键检查
可以在插入数据之前禁用数据表对外键的检查操作,待插入数据完成后再开启
#禁用外部检查
set foreign_key_checks= 0;
#开启外部检查
set foreign_key_checks= 1;
a4.批量插入数据
当向数据表中插入多条数据时,使用insert语句一次插入多条数据比每次插入一条数据的性能要高的很多。
a5.使用load data infile 语句向数据表中导入数据比使用insert语句的性能高。
load data infile 'data_file_path' into table table_name;
其中data_file_path表示的是数据文件的绝对路径,table_name表示数据表的名称。
7.InnoDB数据表插入数据的优化
向myisam数据表中插入数据的优化方案同样适用于InnoDB数据表,但是需要注意的是,在使用load data infile语句向InnoDB数据表批量导入数据时,被导入的文件中的数据记录最好时按照主键顺序排列的,这样可以提高数据的导入效率。
另外,InnoDB是支持事务的,可以在插入数据之前禁用MySQL自动提交事务,待插入数据完毕后,再开启事务的自动提交,这样可以再提高数据的插入性能。
#禁用事务的自动提交
set autocommit= 0;
#开启事务的自动提交
set autocommit= 1;