深入浅出 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条件永远为假