使用explain/desc sql查看SQL执行计划,明确语句执行是否高效。
示例:
explain select id,name from t1 where name=’zhangsan’; desc select id,name from t1 where name=’zhangsan’; |
- 执行计划重要信息
- possible_keys: 该列上可使用的索引
- key: 最终使用的索引
- key_length: 索引长度(越小越快)
- rows: 需要扫描表的行数(越小越好)
说明:
possible_keys:如果很多值,说明列上索引过多;如果是NULL,说明列上没有索引,可以考虑添加索引。
key:SQL执行时,使用的索引。如果是NULL,说明SQL未使用索引,可以考虑添加索引;如果是索引名,表示SQL执行使用了索引,无需优化。
key_length:被用索引的长度,值越小代表索引长度越短,查询时IO就越小,结果返回越快。正常值key_length在32以下,如果超过32说明字段类型过长,考虑使用其他字段类型替代。比如:使用unsigned bigint 替代uuid
Rows:SQL执行需要查询表的行数,所扫描的行数越小,性能越好。如果Rows大于表总行数的20%,表示SQL可能需要优化。
type表示表的连接类型
首先类型有许多,这里我只给大家介绍企业里面用的最多的类型:
system>const>eq_ref>ref>range>index>ALL
越往左边,性能越高
我们自己实际能优化到ref>range这两个类型,就是你自己写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到ref>range这两个级别;
所以,要对type优化的前提是,你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是ALL.....;
索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题。
const:单表中最多有一个匹配行,例如primary key或者unique index
eq_ref:多表连接中使用primary key或者unique index
ref:使用普通索引
range:单表中的范围查询
index:对于前面的每一行,都通过查询索引来得到数据
all:对于前面的每一行,都通过全表扫描来得到数据