mysql执行计划,搞定type和extra就能优化大部分sql了。type为主,extra为辅。
type:
system表只有一行,MyISAM引擎。
const常量连接,表最多只有一行匹配,通用用于主键或者唯一索引比较时
eq_ref每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引
ref如果每次只匹配少数行,那就是比较好的一种,使用=或<=>,可以是左覆盖索引或非主键或非唯一键
fulltext全文搜索
ref_or_null与ref类似,但包括NULL
index_merge表示出现了索引合并优化(包括交集,并集以及交集之间的并集),但不包括跨表和全文索引。这个比较复杂,目前的理解是合并单表的范围索引扫描(如果成本估算比普通的range要更优的话)
unique_subquery在in子查询中,就是value in (select…)把形如select unique_key_column的子查询替换。PS:所以不一定in子句中使用子查询就是低效的!
index_subquery同上,但把形如”select non_unique_key_column“的子查询替换
range常数值的范围
index索引树扫描。a.当查询是索引覆盖的,即所有数据均可从索引树获取的时候(Extra中有Using Index);b.以索引顺序从索引中查找数据行的全表扫描(无 Using Index);c.如果Extra中Using Index与Using Where同时出现的话,则是利用索引查找键值的意思;d.如单独出现,则是用读索引来代替读行,但不用于查找
all全表扫描(full table scan)
extra:
Using index索引最优
Using index condition命中索引,但是查询的列不在索引树中,导致需要查找实际行记录,看情况优化
Using index where只有where,可能没走索引,结合type看情况优化
Using indexfilesort排序优化order by,加索引,需要优化
Using temporary临时表,需要优化
Using join buffer (Block Nested Loop)两个关联表join,关联字段均未建立索引,需要优化
null为空时需要去type找原因