通过explain 我们可以获取到这些信息
- 表的读取顺序
- 数据读取操作的的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器使用
id
id可以认为是查询序列号,每个id代表对应的查询,id大优先级高,优先级高的先执行
select_type 查询的类型
- SIMPLE (简单的select,不使用UNION或子查询)
- PRIMARY (子查询中的外层查询,最外层的select被标记为PRIMARY)
- UNION (UNION中的第二个或后面的select语句)
- DEPENDENT UNION (和UNION同理,取决于外层查询)
- UNION RESULT (UNION的结果,UNION语句中第二个select开始后面所有的select)
- SUBQUERY (子查询中的第一个select,不依赖外部查询)
- DEPENDENT SUBQUERY (子查询中的第一个select,以来外部查询)
- DERIVED (派生表的select,from子句的子查询)
- UNCACHEABLE SUBQUERY (一个子查询的接口不能被缓存,必须重新评估外链接的第一行)
table 输出结果集的表
显示的数据关于哪张表,有时显示的自定义的简称表名
type 表示对表的访问方式
这里只记一些常用的
ALL、index、range、ref、eq_ref、const、system、NULL (性能从差到好)
- All: mysql将遍历全表
- index: 只遍历索引树
- range: 只遍历给定范围的数据
- ref: 表示上述表的连接匹配条件,即哪些字段或常量被用于查找索引列上的值
- eq_ref: 和ref的区别在于 索引是唯一索引
- const: 将主键作为条件
- system: const的特例,当查询出来的数据只有一条时
- null: 执行时甚至不用访问表或索引,例如从一个索引列里选取最小值,可以通过单独索引查找完成
possible key
表示查询数可能使用的索引,指出mysql能使用哪个索引在表中找到记录,查询涉及到的字段若涉及到索引则该索引被列出,但是不一定被查询所使用,如果没有任何索引显示null
key
表示实际使用到的索引
key_len
索引字段的长度,可通过该列计算 查询中使用的索引的长度(key_len显示的值是索引字段的最大可能长度,而不是实际使用长度)
ref
列与索引的比较。表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
rows
扫描出的行数,估算出结果集行数
extra
执行情况的描述和说明。
- Using where 仅通过索引就可以获取所需数据
- Using temporary mysql需要使用临时存储表来存储结果集
- Using filesort 存在order by 并且无法利用索引排序的,称为‘文件排序’
- Using join buffer 获取连接时没有使用索引,并且需要连接缓存区来存储中间结果,建议添加索引
- Impossible where where语句会导致没有符合条件的行
- Select table optimized ayay 意味着仅通过使用索引,优化器仅从聚合函数结果集中返回一行
- No tables used Query语句中使用from dual 或 不含任何 from子句