使用 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');