EXPLAIN用法
EXPLAIN tb_name 或 EXPLAIN [EXTENDED] SELECT select_options
前者可以得出一个表的字段结构等等,后者用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。
示例一:使用EXPLAIN显示表的结构
示例二:EXPLAIN放在SELECT查询语句的前面
EXPLAIN输出信息说明
id
MySQL Query Optimizer 选定的执行计划中查询的序列号。表示查询中执行 select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。
select_type
SIMPLE 简单的 select 查询,不使用union 及子查询
PRIMARY 最外层的 select 查询
UNION UNION 中的第二个或随后的 select 查询,不依赖于外部查询的结果集
DEPENDENT UNION UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
SUBQUERY 子查询中的第一个 select 查询,不依赖于外 部查询的结果集
DEPENDENT SUBQUERY 子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED 用于 from 子句里有子查询的情况。 MySQL会递归执行这些子查询, 把结果放在临时表里。
UNCACHEABLE SUBQUERY 结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估。
UNCACHEABLE UNIONUNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询
table
输出行所引用的表
type
联合查询使用的类型。type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
possible_keys
指出 MySQL 能在该表中使用哪些索引有助于 查询。如果为空,说明没有可用的索引。
key
MySQL 实际从 possible_key 选择使用的索引。 如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情况下,可以在 SELECT 语句中使用 USE INDEX (indexname)来强制使用一个索引或者用 IGNORE INDEX(indexname)来强制 MYSQL 忽略索引
key_len
使用的索引的长度。在不损失精确性的情况 下,长度越短越好。
ref
显示索引的哪一列被使用了。
rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。
extra
如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
如果是where used,就是使用上了where限制。
如果是impossible where表示用不着where,一般就是没查出来啥。
如果此信息显示Using filesort或者Using temporary的话会很吃力,where和order by索引经常无法兼顾,如果按照where来确定缩影,那么在order by时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。