Mysql Explain命令整理

Mysql命令整理

要理解Mysql内部查询机制首先要学会使用Explain命令。

mysql> explain select * from orders where serial_id = '0010001505180005fm';
+----+-------------+--------+------+---------------+-----------+---------+-------+------+-------------+
| id | select_type | table  | type | possible_keys | key       | key_len | ref   | rows | Extra       |
+----+-------------+--------+------+---------------+-----------+---------+-------+------+-------------+
|  1 | SIMPLE      | orders | ref  | serial_id     | serial_id | 122     | const |    1 | Using where |
+----+-------------+--------+------+---------------+-----------+---------+-------+------+-------------+
1 row in set (0.02 sec)

id 表示查找的顺序,如果有union还会为union专门分配一次查找。

select_type 表示查找类型

  • simple 不包含子查询和union的查询类型
  • subquery 包含在select列表中的子查询中的select。(也就是说不在from子句中)。
  • derived 与上面的相反,包含在from子句中的select语句。
  • union 在union中的第二个和随后的select被标记为union。
  • union result 用来从union的匿名临时表检索结果的select。

subquery还可以被标记为dependent(子查询依赖与外部查询)和uncacheable(使用了rand()函数无法缓存)。

table 表示被查找的表。mysql是按照左侧深度优先来查找数据的。如果from子句中有子查询或有union时,会产生派生表。

type 表示关联类型。

  • all 表示全表扫描
  • index 类似于全表扫描,只不过扫描的时候时按照索引的顺序进行的。主要的优点是避免了排序,最大的缺点是每次检索都是随机检索。
  • range 表示范围查找。mysq会把in和or也归类为范围查找,不过in和or会比普通的范围查找性能快很多。
  • ref 索引访问。只有使用非唯一索引或者唯一性索引的非唯一性前缀的时候才会发生。
  • eq_ref 使用这种索引的时候,mysql知道最多只返回一条符合条件的记录。
  • const, system 常量查找

possible_keys 表示可以使用的索引。

key 表示实际使用的索引。

key_len 索引里使用的字节数。

ref 表示之前的表在key列记录的索引中查找所用的列或常量。

rows 表示查找所需要读取的行数。

extra 额外信息

  • using index 表示使用了覆盖索引
  • using where 表示mysql服务器将在存储引擎检索后再进行过滤。
  • using temporary 表示使用了临时表
  • using filesort 表示使用了文件排序
  • range checked for each record (index map: N) 不知道是什么意思。