一文读懂 MySQL 索引( 五 )

explain 使用也很简单,直接在查询语句前面加上 explain 关键字即可:
EXPLAIN SELECT * FROM user where id = 1;

一文读懂 MySQL 索引

文章插图
从图中我们看到 MySQL 返回了一行记录,下面我们一起来分析每个字段代表什么含义
字段含义id一次查询过程中该条 select 语句的唯一标识select_type查询类型,共包含四种 simple、primary、subquery、derivedtable查询的是哪张表partitions表的分区信息type访问类型,分析性能主要通过该字段possible_keys可能会用到的索引key实际用到的索引key_len索引里使用的字节数ref这一列显示了在key列记录的索引中,表查找值所用到的列或常量rowsMySQL 预估的扫描行filteredMySQL 过滤后,满足条件记录数的比例Extra展示了一些额外信息5.2.2 Explain 详解1、id
id 是查询语句中的唯一标识,id 的值越大,该 id 对应的 sql 语句越先执行
explain select * from dept where id = (select dept_id from user where id = 1);
一文读懂 MySQL 索引

文章插图
从执行计划来看,select dept_id from user where id = 1 这条语句先执行,因为外层查询需要借助这条查询语句的结果
2、select_type
查询类型,共包含四种
simple:简单查询 。查询不包含子查询和union
一文读懂 MySQL 索引

文章插图
primary:复杂查询中最外层的 select
一文读懂 MySQL 索引

文章插图
subquery:包含在 select 中的子查询(不在 from 子句中)
一文读懂 MySQL 索引

文章插图
derived:包含在 from 子句中的子查询 。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)
3、table
查询的是哪张表,比较好理解
4、partitions
查询时匹配到的分区信息,对于非分区表值为 NULL,当查询的是分区表时,partitions 显示分区表命中的分区情况 。
5、type
type:查询使用了何种类型,它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是:system> const > eq_ref > ref> ref_or_null > range > index > ALL
  • system 是 const 的特例,也就是当表中只存在一条记录时,type 为 system
  • const,常量查询,id 是主键,通过 id 可以查询到所有信息
    一文读懂 MySQL 索引

    文章插图
  • eq_ref,连接查询中,primary key 或 unique key 索引的所有部分被连接使用
注意:这里 dept 的 id 和 user 的 id 并无关联关系,只是为了演示该查询类型
一文读懂 MySQL 索引

文章插图
user 的 id 和 dept 的 id 都是主键,在连接查询中,两个主键都被使用到
  • ref,不使用唯一索引,使用普通索引或者唯一索引,可能会找到多个条件的值,idx_name 是普通索引

一文读懂 MySQL 索引

文章插图
  • ref_of_null,和 ref 功能类似,区别在于会额外搜索索引包含 NULL 的值,name 字段是普通索引,且数据库中存在 name 为 null 的数据

一文读懂 MySQL 索引

文章插图
  • range,在索引字段上使用范围查询,常见的有 >、<、in、like 等查询

一文读懂 MySQL 索引

文章插图