EXPLAIN介绍
在select语句之前增加explain关键字,执行查询会返回执行计划信息,而不是执行这条SQL;我们可以根据返回的执行计划分析查询语句的性能瓶颈,总而言之explain可以模拟优化器执行SQL语句。
explain中的列
- id列
- id列是select的序列号,id列越大执行优先级越高,相同则从上往下,为Null则最后执行
- select_type列
- simple:简单查询(不包含子查询和union)
- primary:复杂查询中最外层的 select
- subquery:包含在 select 中的子查询(不在 from 子句中)
- derived:包含在 from 子句中的子查询(派生表)
- union:在 union 语句中的除第一个select外的其他select
- table列
- 这一列表示explain结果表中的这行正在访问哪个表
- type列
- 这一列表示关联类型或访问类型,依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL
- system,const:用于primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快,system是const的特例,表里只有一条元素匹配时为system
- eq_ref:primary key 或 unique key 索引的所有部分被连接使用,最多只会返回一条符合条件的记录。
- ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀。
- range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
- index:扫描全表索引,这通常比ALL快一些
- ALL:即全表扫描
- 这一列表示关联类型或访问类型,依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL
- possible_keys列
- 这一列显示查询可能使用哪些索引来查找。
- key列
- 这一列显示mysql实际采用哪个索引来优化对该表的访问。
- key_len列
- 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
- ref列
- 这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名
- rows列
- 这一列是mysql估计要读取并检测的行数
- Extra列
- 这一列展示的是额外信息,常见值有
- Using index:使用覆盖索引
- Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围
- Using where:使用where语句来处理结果,查询的列未被索引覆盖
- Using temporary:mysql需要创建一张临时表来处理查询。
- Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序
- 这一列展示的是额外信息,常见值有