[mysql 详解]mysql explain 使用详解
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”
- 遇到范围查询时,就停止索引的匹配
参考#
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: