判断一条语句在执行的时候有没有走索引,我们可以再该语句之前增加 explain关键字,在使用了explain关键字后,可以向你显式的表明,该语句的性能。我们先来了解一下各个标识的意思
+----+-------------+-------+-------+-------------------+---------+---------+-------+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------
id
:所检索的数据的序列号
select_type
:
就是select的类型
取值
SIMPLE | 简单的查询,没有子查询,也没有union |
PRIMAR | 主查询,有子查询的外边的查询 |
UNION | UNION中的第二个或者后边的select |
DEPENDENT UNION | 指子查询中的第二个或者后边的select |
UNION RESULT | UNION 的整个查询 |
SUBQUERY | 子查询中的第一个SELECT |
DEPENDENT SUBQUERY | 子查询中的第一个SELECT,取决于外面的查询 |
DERIVED | 派生表的SELECT, FROM子句的子查询 |
table
:即所查询的数据库表名。
type
:主要衡量该检索的性能:
ALL | 全表扫描 |
index | 全索引扫描 |
range | 给定索引范围进行扫描 |
ref | 表示连接,即扫描条件是某个常量,或者列 |
eq_ref | 类似于ref,区别是所使用的索引是唯一索引不存在相同的值 |
const,system | 在查询时mysql的优化,where语句后被优化为一个常量进行查询 |
NULL | MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成 |
possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
key
:显示Mysql实际决定使用的键(索引)
key_len
:
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
ref
:
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
Extra:该列包含MySQL解决查询的详细信息,有以下几种情况:
Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。