explain 简介
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化.
输出格式(字段)
- id
- select_type
- table
- partitions
- type
- possible_keys
- ket
- ref
- rows
- filtered
- extra
select_type
表示查询类型
- SIMPLE
查询不包含union 和子查询
- PRIMARY
最外层的查询
- UNION
UNION的第二或者随后的查询
- DEPENDENT UNION
union的第二个或者后面的查询语句
- UNION RESULT
union的结果
- SUBQUERY
子查询中第一个select
- DENPENDENT SUBQUERY
子查询中第一个select ,取决于外面的查询
table
表示查询涉及的表或衍生表
type
判断查询是全表查询还是索引扫描
- system
表中只有一条数据,特殊的const类型
- const
针对主键或这唯一索引查询,最多返回一条数据。
- eq_ref
多表join查询,表示前表都能匹配到后表的结果
- ref
使用了最左前缀规则索引的查询(针对于非唯一或者非主键索引)
- range
表示使用索引范围查询, 当 type 是 range 时, 那么 EXPLAIN 输出的 ref 字段为 NULL, 并且 key_len 字段是此次查询中使用到的索引的最长的那个
- index
全索引扫描(扫描所有的索引)
index 类型通常出现在: 所要查询的数据直接在索引树中就可以获取到, 而不需要扫描数据. 当是这种情况时, Extra 字段 会显示 Using index.
- all
全表扫描
性能比较
system 》 const 》 eq_ref 》 ref 》 range 》 index 》 all
possible_keys
查询时可能使用的索引。
key
查询中真正使用的索引
ken_len
查询优化器使用了索引的字节数。评估组合是否完全使用,或者只有最左部分被使用。
rows
MySQL 查询优化器根据统计信息, 估算 SQL 要查找到结果集需要扫描读取的数据行数.
这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好.
Extra
- Using filesort
表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果
- Using index
“覆盖索引扫描”, 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错
- Using temporary
查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化.
最左前缀匹配
在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配
- 索引的字段可以是任意顺序的
以下两种都能走索引 :
KEY test_col1_col2_col3 on test(col1,col2,col3);
SELECT * FROM test WHERE col1=“1” AND clo2=“2”
SELECT * FROM test WHERE col2=“2” AND clo1=“1”
- 遇到范围查询时, 就停止索引的匹配