[转]mysql explain详解

关于常常运用mysql的兄弟们,对explain一定不会生疏。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处置SELECT,提供有关表如何结合和以什么次第的信息。
借助于EXPLAIN,你可以晓得
1)你什么时分必需为表参加索引以失掉一个运用索引找到记载的更快的SELECT。
2)你也能晓得优化器能否以一个最佳次第联合表。为了强迫优化器对一个SELECT语句运用一个特定联合次第,添加一个STRAIGHT_JOIN子句。
官方的关于explain的文档在http://dev.mysql.com/doc/refman/5.1/en/using-explain.html(英文),本文可作为官方文献的不完好浅显读物。
运用的办法

EXPLAIN tbl_name
或:
EXPLAIN [EXTENDED] SELECT select_options

前者可以得出一个表的字段构造等等,后者次要是给出相关的一些索引信息,而明天要讲述的重点是后者。
举例

mysql> explain select * from event;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)
各个属性的含义

id
select查询的序列号

select_type
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能运用哪个索引在该表中找到行。假如是空的,没有相关的索引。这时要进步功能,可经过检验WHERE子句,看能否援用某些字段,或许反省字段不是合适索引。

key
显示MySQL实践决议运用的键。假如没有索引被选择,键是NULL。

key_len
显示MySQL决议运用的键长度。假如键是NULL,长度就是NULL。文档提示特别留意这个值可以得出一个多重主键里mysql实践运用了哪一局部。

ref
显示哪个字段或常数与key一同被运用。

rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不精确的。

Extra
假如是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
假如是where used,就是运用上了where限制。
假如是impossible where 表示用不着where,普通就是没查出来啥。
假如此信息显示Using filesort或许Using temporary的话会很费劲,WHERE和ORDER BY的索引常常无法统筹,假如依照WHERE来确定索引,那么在ORDER BY时,就必定会惹起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。
罕见的一些名词解释

Using filesort
MySQL需求额定的一次传递,以找出如何按排序顺序检索行。

Using index
从只运用索引树中的信息而不需求进一步搜索读取实践的行来检索表中的列信息。

Using temporary
为理解决查询,MySQL需求创立一个暂时表来包容后果。

ref
关于每个来自于后面的表的行组合,一切有婚配索引值的即将从这张表中读取

ALL
完全没有索引的状况,功能十分地差劲。

index
与ALL相反,除了只要索引树被扫描。这通常比ALL快,由于索引文件通常比数据文件小。

SIMPLE
复杂SELECT(不运用UNION或子查询)

发表评论