explain 的使用

一、explain 的使用

Explain 可以获取 MySQL 中 SQL 语句的执行计划,比如语句是否使用了关联查询、是否使用了索引、扫描行数等。可以帮我们选择更好地索引和写出更优的 SQL。使用方法:在 SQL 语句前面加上 explain 运行就可以了。

1
2
3
4
5
6
mysql> explain select * from user where name = '6';
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user | NULL | ref | name_index | name_index | 363 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
列名 描述
id 在一个大的SQL语句中每个 select 关键字都对应一个唯一的 id
select_type SQL语句类型
table 表名
partitions 匹配的分区信息
type 针对单表的访问方法
possible_keys 可能使用到的索引
key 实际上使用的索引
key_len 实际使用的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估需要读取的记录数
filtered 某个表经过搜索条件过滤后剩余记录条数的百分比
Extra 一些额外的信息
1. select_type 列一部分解释
select_type 的值 解释
SIMPLE 简单查询(不使用关联查询或子查询)
PRIMARY 如果包含关联查询或者子查询,则最外层的查询部分标记为 primary
UNION 联合查询中第二个及后面的内容
2. type 列
type 的值 解释
system 查询对象列只有一行数据,且只能用于 MyISAM 和 Memory 引擎的表,这是最好的情况
const 基于主键或唯一索引查询,最多返回一条结果
eq_ref 表连接时基于主键或非 NULL 的唯一索引完成扫描
ref 基于普通索引的等值查询,或者表间等值连接
fulltext 全文索引
ref_or_null 表连接类型是 ref,但进行扫描的索引列中可能包含 NULL 值
index_merge 利用多个索引
unique_subquery 子查询中使用唯一索引
index_subquery 子查询中使用普通索引
range 利用索引进行范围查询
index 全索引扫描
3. extra 列解释
Extra 常见的值 解释
Using index 使用覆盖索引
Using index condition 先条件过滤索引,在查数据
Using where 使用 where 语句来处理结果
Using temporary 需要创建一个临时表来存储结构,通过发生对没有索引的列进行 Group By 时
Impossible where 对 where 子句判断的结果总是 false 而不能选择任何数据
Using join buffer ( Block Nested Loop ) 关联查询中,被驱动表的关联字段没有索引
Select tables optimized away 使用某些聚合函数(比如 max、min)来访问存在索引的某个字段