MySQL 执行计划需要详细查看的内容
1、id(重要):每一个select语句都会分配一个id。
id相同,从上到下执行
id不同,id越大,越先执行
id为null,不查询,仅表示一个结果集
2、select_type(重要):查询类型
simple:简单查询,不包括子查询,union查询
primary:select查询字段列中存在子查询
union:存在union操作,且union操作外还进行查询
union result:union之后的结果
derived:查询之后再查询(查询里面嵌套查询)
subquery:where条件中包含子查询
3、table:显示查询的表名
4、type(重要):判断是否用到索引,执行计划的连接类型
效率由高到低:system > const > eq_ref > ref > range > index > all
system:表里只有一行数据或空表
const:使用唯一索引或主键,或者where条件查询返回1条记录
eq_ref:join时使用主键或者唯一索引连接,前表的每一个结果,都只匹配到后表的一行结果
ref:针对非唯一索引等值查询、关联
range:索引范围扫描,常见的有 >,<,is null,between and,in,like等运算
index:索引全表扫描,查询的联合索引字段出现在select后,或者where后
all:全表数据扫描
5、key(重要):真正使用到的索引
6、Extra(重要):
distinct:使用到了distinct关键字
no tables used:不带from子句的查询
using where:使用到了where条件
using index:查询时不需要回表,可直接通过索引查到数据
using temporary:临时表存储中间结果(对查询结果order by、group by)
using filesort:排序时无法使用到索引(常见于order by、group by)
7、rows:扫描的行数
不是精确值 (lnnoDB不是精确的值,MVISAM是精确的值,主要原因是lnnoDB 里面使用了MVCC并发机制)