概述
explain
是去查看MySQL如何查询数据
explain示例:
EXPLAIN SELECT * FROM student WHERE `name`='Walter Yan' AND age=25
EXPLAIN返回值的格式
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | student | ALL | 3 | 33.33 | Using where |
id
: 当前的查询标识符.
select_type
: 查询类型, 具体请参考MySQL手册中的13.2.10 SELECT Statement章节.
table
: 当前的表名.
partitions
: 当前数据的分区, 如果没有分区则为NULL.
type
: 联接的类型, 比如ALL,const等, 不同的联接类型会导致MySQL采用不同的方法区查找数据.
possible_keys
: 可能用到的key.
keys
: 显示MySQL实际决定使用的键值(或者索引).
key_len
: MySQL决定使用的键值的长度.
ref
: 显示将哪些列或常量与键列中命名的索引进行比较,以从表中选择行.
rows
: MySQL执行查询必须检查的行数.
filtered
: 通过条件查询(比如where条件)过滤到的行数.
Extra
: 其他信息.
type: EXPLAIN联接类型
EXPLAIN语句的返回表的type
字段描述了参与SQL运算的表之间是如何联接的. 下面列表中的联接方式是由好到坏排列
的.
syatem
const
这张表最多只包含一条与这个查询匹配的行, 而这一行在查询开始时候就被读取到. 因为只有一行,所以这一行的其他字段的值就被剩余的优化器视为常量. 常量表的查询非常快, 因为他们只会被读取一次.
当我们使用唯一索引
eq_ref
ref
从先前表读取所有索引匹配的行组合, ref如果进行联接,则只是使用键值的最左前缀,如果键不是primary key或者unique key(即是:如果联接无法通过键值选择单个行). 如果使用的键值仅需要匹配几行, 则这是一个很好的方式.
ref适用于那些加了索引的列的比较(=, <=, =>), 在如下示例中, MySQL将采用ref join去处理ref_tbl.
# 在role_name字段上添加一个普通BTREE索引
EXPLAIN SELECT * FROM t_role WHERE role_name='admin';
EXPLAIN SELECT * from ref_tbl, other_tbl WHERE ref_tbl.col1=other_tbl.col1;
ALL
对在形成组合表之前的表进行全表扫描(逐行扫描).