可参考:https://javaguide.cn/database/mysql/mysql-query-execution-plan.html
优化 sql 语句首先就要知道 sql 执行的情况,则可使用 explain 命令。
其他 sql 性能分析方式可以看:SQL性能分析和优化 | KTnoobStation (gitee.io)
执行计划
执行计划是一条 sql 语句经过 Mysql 查询优化器优化后选择的具体执行方式。
使用 explain 命令可以获得 sql 语句具体的执行计划,如查询表的顺序、是否使用了索引,索引的类型,使用了什么索引、每个表被查询了多少条数据等信息。
explain 命令的使用和使用结果
语法
直接 explain + SQL 语句,CRUD 类型的操作都可支持。
实例
假设使用命令:
mysql> explain SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM dept_emp GROUP BY emp_no HAVING COUNT(emp_no)>1);
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
| 1 | PRIMARY | dept_emp | NULL | ALL | NULL | NULL | NULL | NULL | 331143 | 100.00 | Using where |
| 2 | SUBQUERY | dept_emp | NULL | index | PRIMARY,dept_no | PRIMARY | 16 | NULL | 331143 | 100.00 | Using index |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
explain 结果的一些重要字段
包括:id、select_type、table、type、possible_keys、key、rows、extra 这些。下面简单说明一下。
Id :标识整个查询中 SELELCT 语句的顺序。
Select_type:查询的类型,主要用于区分普通查询、联合查询、子查询等复杂的查询
可能的取值:
SIMPLE:简单查询,不包含 UNION 或者子查询。
PRIMARY:如果包括子查询,则主查询被这个修饰。
SUBQUERY:子查询中的第一个 SELECT。
UNION:联合查询语句中,UNION 之后出现的 SELECT。Table:查询用到的表。
Type:查询执行的连接类型,是全表查询,还是索引查询等。
Possible_keys:可能会用到的索引,像上面案例中可能会用到主键索引 PRIMARY 和 dept_no 索引。
Key:实际用到的索引。
Rows:即查询到的数据行数。
extra(重要):说明数据库执行该 sql 语句具体是干了什么,比如使用了索引就是 using index, 使用了条件查询但是没用到索引:using where 等
其他取值:
Using filesort:在排序时使用了外部的索引排序,没用到表内索引进行排序。
Using temporary:MySQL 需要创建临时表来存储查询的结果,常见于 ORDER BY 和 GROUP BY。
Using index:表明查询使用了覆盖索引,不用回表,查询效率非常高。Using index condition:表示查询优化器选择使用了索引条件下推这个特性。
Using where:表明查询使用了 WHERE 子句进行条件过滤。一般在没有使用到索引的时候会出现。