Explain执行计划
explain可以帮助开发人员分析SQL问题,explain用于显示MySQL如何使用SQL执行计划,可以帮助开发人员写出更优化的查询语句。使用方法就是在查询语句前加上explain关键字。
执行添加上explain关键字的语句可以看到一个列表:
其主要结果列说明如下;
- id: id列是select的序列号,有几个select就有几个id,并且是按select出现的顺序增长的,id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
- select_type: select_type列表示对应行查询的类型,其类型分别是:SIMPLE、SUBQUERY、DERIVED、PRIMARY、UNION、UNION RESULT。
SIMPLE:简单查询,不包含子查询和union
SUBQUERY:包含在select中的子查询
DERIVED:包含在from子句中的子查询
PRIMARY:复杂查询中最外层的select
UNION:在union中的第二个和随后的select
UNION RESULT:从union临时表检索结果的select - table: table列表是explain的一行正在访问哪个表。
- type: type列表示关键类型或访问类型,system>const>eq_ref>ref>range>index>ALL,一般达到range级别,最好达到ref级别。
- possible_keys: possible_keys列表示查询可能使用哪些索引来查找,但是最终查询可能不使用索引。
- key: key列表示MySQL实际使用哪个索引来对该表进行查询。
- key_len: key_len列表MySQL在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
- ref: ref列表示在key列记录的索引中,表查找值所用到的列或常量。
- rows: rows列表示MySQL估计要读取并检测的行数,需要注意的是,是估计值,并非最后结果集里的行数。
- Extra:Extra列表示的是一些额外信息
Using Index:使用覆盖索引
Using where:使用where语句来处理结果,查询的列未被索引覆盖
Using Index condition:查询的列不完全被索引覆盖,需要回表查询
Using temporary:需要创建临时表来处理查询
Using filesort:将用外部排序而不是索引排序
Select tables optimized away:使用某些聚合函数(max)来访问存在索引的某个字段时出现