用explain来获取关于查询执行计划的信息。比如mysql中有慢查询语句,可以通过explian来返回其执行计划中的信息,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
explain命令
EXPLAIN select * from address;
explain 的列
执行结果
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE address ALL 1 100
1.id列
这一列总是包含一个编号,标识select所属的行。如果在语句中没有子查询或者是联合查询,那么只会有唯一的select。可以理解为select的一个执行顺序,id越小的越晚执行。
2.select_type列
显示对应的select是一个简单还是复杂select
simple
表示查询不包括子查询和UNION
SUBQUERY
包含在select列表中的子查询中的select(不在from子句中)
DERIVED
包含在FROM子句的子查询中的select。
UNION
在UNION中的第二个和随后的select被标记为UNION
3.table列
这一列显示了对应行正在访问哪个表。或者是该表的别名。
4.type列
访问类型。---mysql决定如何查找表中的行。下面是重要的访问类型,从最差到最优。
ALL
全表扫描,mysql必须扫描整张表。
index
mysql扫描表时按照索引次序进行,而不是行。主要优点是避免了排序。
range
范围扫描是一个有限制的索引扫描,它开始于索引里的某个点,返回匹配这个值域的行。例如between and 或者是where > < 的查询。in和or也会显示为范围查询
ref
这是一种索引访问,返回所有匹配某个单个值的行。是查找和扫描的混合体。
eq_ref
使用这种索引查找,mysql知道最多只返回一条符合条件的记录。这种访问方法可以在mysql使用主键或者唯一性索引查找时看到。
const,system
当mysql能对查询的部分进行优化,并将其转换成一个常量时,它就会使用这些访问类型。比如,你通过将某一行的主键放入where子句的方式来选取此行的主键。
NULL
这种访问方式意味着mysql能在优化阶段分解查询语句,在执行阶段甚至不用再访问表或者索引。
5.possible_keys列
显示了查询可以使用那些索引,这是基于查询访问的列和使用的比较操作符来判断的。这个列表是在优化过程的早期创建的,因此有些罗列出来的索引可能对于后续的优化过程是没用的。
6.key列
显示了mysql决定采用哪个索引来优化对该表的访问。possible_keys表示选择哪个索引能有助于高效的查询,而key显示的是优化采用哪一个索引可以最小化查询成本。
7.key_len列
显示了mysql在索引里使用的字节数。
可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
8.ref列
这一类显示了之前的表在key列记录的索引中查找值所用的列或者常量。
9.rows列
mysql估计为了找到所需的行而要读取得行数,
10.Extra列
包含的是不适合在其它列显示的额外信息。
常见的最重要的几个值:
Using index
此值表示mysql将使用覆盖索引,避免访问表。
Using where
表示查询可收益于不同的索引。mysql服务器将在存储引擎检索后再进行过滤。
using temporary
mysql在对查询结果排序时会使用一个临时表。
using filesort
mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。
range checked for each record(index map:N)
表示没有好用的索引,新的索引将在联接的每一行上重新估算。
explain的限制:
- explain不会告诉你触发器,存储过程会如何影响查询
- 不支持存储过程,所以需要手动抽取查询单独进行explain操作
- 不会告诉你mysql在查询执行中所做的特定优化
- 不会显示关于查询的执行计划的所有信息
- 不区分具有相同名字的事物。