From e395670f804cabbd91d8e08bdfbb4aca0ff6993f Mon Sep 17 00:00:00 2001 From: heibaiying <2806718453@qq.com> Date: Tue, 23 Jul 2019 17:40:40 +0800 Subject: [PATCH] MySQL_EXPLAIN --- notes/MySQL_EXPLAIN.md | 95 +++++++++++++++++++++++++++++++++++++ pictures/mysql-explain.png | Bin 0 -> 10682 bytes 2 files changed, 95 insertions(+) create mode 100644 notes/MySQL_EXPLAIN.md create mode 100644 pictures/mysql-explain.png diff --git a/notes/MySQL_EXPLAIN.md b/notes/MySQL_EXPLAIN.md new file mode 100644 index 0000000..8c470b7 --- /dev/null +++ b/notes/MySQL_EXPLAIN.md @@ -0,0 +1,95 @@ +# MySQL EXPLAIN + +EXPLAIN 关键字可以用于获取所修饰语句执行计划的相关信息,在 MySQL 8.0 中,EXPLAIN 支持大多数常见的语句,如 SELECT 、DELETE 、INSERT 、REPLACE、和 UPDATE 语句。示例如下: + +```sql +-- 查询工资大于100000的雇员所在部门的编号 +EXPLAIN SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM salaries WHERE salary > 100000) LIMIT 100; +``` + +![mysql-explain](D:\Full-Stack-Notes\pictures\mysql-explain.png) + +```sql + +mysql> EXPLAIN SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM salaries WHERE salary > 100000) LIMIT 100; ++----+-------------+----------+------+---------------+---------+---------+---------------------------+--------+-----------------------------------+ +| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ++----+-------------+----------+------+---------------+---------+---------+---------------------------+--------+-----------------------------------+ +| 1 | SIMPLE | dept_emp | ALL | PRIMARY | NULL | NULL | NULL | 331570 | NULL | +| 1 | SIMPLE | salaries | ref | PRIMARY | PRIMARY | 4 | employees.dept_emp.emp_no | 4 | Using where; FirstMatch(dept_emp) | ++----+-------------+----------+------+---------------+---------+---------+---------------------------+--------+-----------------------------------+ +``` + +> 注:本篇文章测试数据来源于 MySQL 官方提供的 [Employees Sample Database](https://dev.mysql.com/doc/employee/en/) + +### 1. id + +每个 SELECT 语句都会对应输出结果中的一行数据,id 列是该行数据的编号,如果在语句当中没有子查询或者联合查询,则每行数据的编号都是 1 。如果涉及到 FROM 子查询 或者 UNION 查询,则编号通常会按照其在原始语句中的位置排序。示例如下: + +```sql +-- 该FROM字句只是用于演示 +mysql> EXPLAIN SELECT COUNT(1) FROM (SELECT emp_no FROM salaries) AS s; ++----+-------------+------------+-------+ +| id | select_type | table | type | ++----+-------------+------------+-------+ +| 1 | PRIMARY | | ALL | +| 2 | DERIVED | salaries | index | ++----+-------------+------------+-------+ ...... +``` + +```sql +-- 查询工资大于500000或部门编号等于d007的所有雇员的编号 +mysql> EXPLAIN SELECT emp_no FROM salaries WHERE salary>500000 UNION ALL SELECT emp_no FROM dept_emp WHERE dept_no = "d007"; ++----+--------------+------------+------+ +| id | select_type | table | type | ++----+--------------+------------+------+ +| 1 | PRIMARY | salaries | ALL | +| 2 | UNION | dept_emp | ref | +| NULL | UNION RESULT | | ALL | ++----+--------------+------------+------+ ...... +``` + +### 2. select_type + +### 3. table + +- ****:输出结果中编号为 M 的行与编号为 N 的行的结果集的并集。 +- ****:输出结果中编号为 N 的行的结果集,使用 derived 修饰表示这是一个派生结果集,如来自于 FROM 子句中的子查询 。 +- ****:输出结果中编号为 N 的行的结果集,使用 subquery 修饰表示其来源于一个物化子查询。 + +### 4. type + +这个字段表示 MySQL 如何查找表中的行。常见参数按照查找性能由低到高,排序如下: + ++ ALL:全表扫描; ++ index:按照索引顺序而不是行顺序进行全表扫描; ++ range:范围扫描; ++ ref: + +### 5. possible_keys + +表示在执行过程中可能会用到哪些索引来进行优化。 + +### 6. key + +表示在执行过程中实际用到的用于优化的索引。 + +### 7. key_len + +表示使用到的索引的字节数。 + +### 8. ref + + + +### 9. rows + +MySQL 为了找到目标行而读取的所有行的数量,这是一个估算的值。 + +### 10. Extra + +用于显示额外的信息,常用 + +### 11. partitions + +显示查询结果集中记录所在的分区。如果目标表不是分区表,则值为 null 。 \ No newline at end of file diff --git a/pictures/mysql-explain.png b/pictures/mysql-explain.png new file mode 100644 index 0000000000000000000000000000000000000000..d87d967992e505a0c4bb0f913cfafe3638ee0274 GIT binary patch literal 10682 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 literal 0 HcmV?d00001