深入浅出 MySQL EXPLAIN详解:索引分析与查询优化详解
索引分析与优化
MySQL 提供了一个 EXPLAIN 命令,可以对 SELECT 语句进行分析。
EXPLAIN SELECT * from wzk_user WHERE id < 1;
select_type
表示查询的类型:
- SIMPLE:最简单的查询类型
- PRIMARY:最外层的主查询
- UNION:UNION操作的第二个或后续查询
- SUBQUERY:独立的子查询语句
type
表示存储引擎查询数据时采用的方式,按效率从低到高:
- ALL:全表扫描
- index:基于索引的全表扫描
- range:使用索引进行范围查询
- ref:使用非唯一索引进行单值查询
- eq_ref:多表JOIN中使用主键或唯一索引
- const:使用主键或唯一索引做等值查询
- NULL:不用访问表就能得到结果
possible_keys
表示MySQL优化器可能考虑使用的索引列表。
key
表示查询优化器实际选择使用的索引名称。当为NULL时表示没有使用任何索引。
rows
MySQL查询优化器估算SQL要查询到结果需要扫描多少行记录。原则上rows越少效率越高。
key_len
表示查询使用了索引的字节数量。
计算规则:
- 字符串类型:latin1=1,gbk=2,utf8=3,utf8mb4=4
- 数值类型:TINYINT=1,SMALLINT=2,INT=4,BIGINT=8
- 时间类型:DATE=3,DATETIME=8
Extra 信息详解
- Using where:需要通过索引回表查询数据
- Using index:查询可仅通过索引完成(覆盖索引)
- Using filesort:查询结果需要额外排序
- Using temporary:查询使用了临时表
- Impossible WHERE:WHERE条件永远为假