mysql explain
18 August 2018
原文: 8.8.2 EXPLAIN Output Format

从左到右依次是

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra

possible_keys

The possible_keys column indicates the indexes from which MySQL can choose to find the rows in this table.

key

The key column indicates the key (index) that MySQL actually decided to use.

在一种情况下,key 可以不为空,但是 possible_keys 可以为空:
mysql 判断这个搜索所需的 col 可以只在 index 中找到,但是无法使用到索引来过滤数据(比如复合索引没用到第一列)。

挑重要的讲 type, extra, select_type

type

The join type.

join type 按好到坏排:

system, const, eq_ref, ref, fulltext, ref_or_null, index_merge, unique_subquery, index_subquery, range, index, all

all: 最差的,表示全表扫描,一点都不走索引了。除了 all 其他情况都表示会走索引,只是怎么走,走多走少的区别
index: 倒数第二差,也是全表扫描,不过这次扫描可以直接在索引里面扫完。 An index-only scan usually is faster than ALL because the size of the index usually is smaller than the table data.

range: 表示查出来的数据要根据索引来决定,索引取出来的数据一个有范围的,不止一条
const: 表示查出来的数据要根据索引来决定,且索引取出来的数据只有一条
system: 和 const 一样,system table

eq_ref 和 ref (表的数据是引用另外一个表的出来的)

select * from tb1 where id in (select id from tb2 where xxx);        -- eq_ref
select * from tb1 where idx_col in (select id from tb2 where xxx);   -- ref
select * from tb1 where noidx_col in (select id from tb2 where xxx); -- all

unique_subquery 和 index_subquery

unique_subquery
This type replaces eq_ref for some IN subqueries of the following form

mysql> value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery
This join type is similar to unique_subquery

index merge: 通常情况下,mysql 只能使用到一个索引,index merge 是例外。(mysql 一般只会在查询数据量小的情况下会走 index merge)

Using intersect(...)
Using union(...)
Using sort_union(...)