0 介绍
0.1 是什么
使用 Explain 关键字可以模拟优化器执行 Sql 查询语句, 从而知道 Mysql 是如何处理 Sql 的.
0.2 用法
Explain + Sql 语句
0.3 执行计划包含的信息
如下图:
接下来, 将对这 10 个表头中的字段一一进行说明.
1 id
1.1 概念
Select 查询的序列号, 包含一组数字, 表示查询中执行 Select 子句或操作表的顺序
1.2 三种情况
1.2.1 ID 相同, 执行顺序由上至下
如上图, Mysql 认为三个 ID 相同均为 1; 于是, 执行顺序由上至下; 所以, Mysql 会按照 t1 --> t3 --> t2 的顺序加载这三张表.
1.2.2 ID 不同, 值越大优先级超高, 越先被执行
如上图, Mysql 认为三个 ID 不相同(分别为 1,2,3); 于是, 先执行值大的; 所以, Mysql 会按照 t3 --> t1 --> t2 的顺序加载这三张表.
提示: 如果是子查询, ID 的序号会递增(如上图, id=2 & id=3 的这两项就是子查询 SUBQUERY).
1.2.3 ID 相同不同, 同时存在
如上图, ID 存在两种值(分别是 id = 1 & id = 2); 值大的先执行, 于是, id=2 的先执行, 对应就是 t3 表先加载; 然后是两个 id=1 的, 又按照由上至下的执行顺序, 于是, 先加载 derived2 表后加载 t2 表. 所以这三张表最终的加载顺序就是 t3 --> derived2 --> t2.
提示: derived2 中的 2 表示衍生自 id=2 的那条记录(即衍生自 t3 表)
1.3 结论
ID 值越大越先被执行, 如果 ID 相同则由上至下执行
2 select_type
有以下 6 种取值:
- SIMPLE
- PRIMARY
- SUBQUERY
- DERIVED
- UNION
- UNION RESULT
- 3 table
显示这一行的数据是关于哪张表的
4 type-- 非常重要 -- 非常重要 -- 非常重要
4.1 介绍
type 是指: 访问类型
从最好到最差依次是: system> const> eq_ref> ref> range> index> all
一般来说, 得保证查询至少达到 range 级别, 最好能达到 ref.
4.2 详细说明
4.2.0 数据准备
- DROP TABLE IF EXISTS employee;
- CREATE TABLE IF NOT EXISTS employee(
- id INT PRIMARY KEY auto_increment,
- name VARCHAR(40),
- dept_id INT
- );
- INSERT INTO employee(name, dept_id) VALUES('Alice', 1);
- INSERT INTO employee(name, dept_id) VALUES('Alice2', 1);
- INSERT INTO employee(name, dept_id) VALUES('BOb', 2);
- INSERT INTO employee(name, dept_id) VALUES('BOb2', 2);
- DROP TABLE IF EXISTS department;
- CREATE TABLE IF NOT EXISTS department(
- id INT PRIMARY KEY auto_increment,
- name VARCHAR(40)
- );
- INSERT INTO department(name) VALUES('RD');
- INSERT INTO department(name) VALUES('HR');
数据说明: 2 个部门, 4 个员工, 每个部门两个员工
4.2.1 const
表示通过索引一次就找到了, 用于比较主键索引或者唯一性索引. 如将主键置于 Where 条件中, Mysql 就能将该查询转换为一个常量
EXPLAIN SELECT * FROM employee WHERE id = 1;
结果:
说明: id 是主键, 将 id = 1(常量)置于 WHERE 条件中, 于是, 结果是 Const
4.2.2 system
表只有一行记录, 是 Const 的特例, 平时不会出现, 可忽略
EXPLAIN SELECT * FROM (SELECT * FROM employee WHERE id = 1) e;
结果:
说明: 由于括号中的查询只会返回唯一结果, 所以, 外层再查询时就只有一条记录, 于是, 结果是 System
4.2.3 eq_ref
唯一性索引扫描. 对于每个索引键表中只有一条记录与之匹配. 常见于主键或唯一索引扫描
- 6.1 key = Null
- 6.1.1 possible_keys = Null
- 6.2 key != Null
- 6.2.1 possible_keys = Null
- 10 extra
- 10.1 Using Filesort
来源: https://www.cnblogs.com/cyhbyw/p/8901277.html