一 :explain 分析sql的执行计划
explain select语句,会查询出select语句的执行计划,找出低效sql然后进行优化。
主要的三个字段:type :访问类型,key:索引,rows:扫描行数。
type 的值为system const的时候性能最高,在使用主键和唯一索引进行查询时候最多返回一条记录的时候会出现。为all的时候,表示全表扫描,不使用索引,性能最低。
二:使用索引优化查询
1 mysql自身索引的特点:
(1)mysql的索引字段值为null的时候,也会使用索引,这点与oracle不同,如: where name is null,此时也会使用索引。
(2)mysql5.6对联合索引的处理与之前版本有区别: 对于联合索引,之前版本是在存储引擎中对联合索引的第一个字段过滤,然后回表,跟进联合索引的其他字段对数据过滤。5.6版本,在存储引擎中根据联合索引的第一个字段过滤,然后再依次根据联合索引后面的字段对索引过滤,最后回表。新版本中,回表数据较少,可以减少IO操作。
2 有些情况索引不会被使用
(1)联合索引必须出现最左端字段,否则索引不会被使用。
(2)使用索引字段进行like的时候,不能在前面加%。
(3)使用or的时候,前面的条件使用索引,后面的条件不使用索引,则mysql不会使用索引。
(4)如果mysql预估使用索引查询比直接去表查询还要慢,mysql则不会使用索引。
三:优化sql语句
1 使用order by 语句的时候,要让order by 字段顺序与联合索引顺序一致,并且同时升序或降序,可能会避免额外的查询。
2 使用group by 语句的时候,会隐形执行一个 order by 相同的字段,为了禁止该操作,可以在后面加个order by null.
3 使用联合查询代替子查询,可以避免创建临时表,从而提高效率。