Mysql执行计划分析


可参考: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 这些。下面简单说明一下。

  1. Id :标识整个查询中 SELELCT 语句的顺序。

  2. Select_type:查询的类型,主要用于区分普通查询、联合查询、子查询等复杂的查询

    可能的取值:
    SIMPLE:简单查询,不包含 UNION 或者子查询。
    PRIMARY:如果包括子查询,则主查询被这个修饰。
    SUBQUERY:子查询中的第一个 SELECT。
    UNION:联合查询语句中,UNION 之后出现的 SELECT。

  3. Table:查询用到的表。

  4. Type:查询执行的连接类型,是全表查询,还是索引查询等。

  5. Possible_keys:可能会用到的索引,像上面案例中可能会用到主键索引 PRIMARY 和 dept_no 索引。

  6. Key:实际用到的索引。

  7. Rows:即查询到的数据行数。

  8. extra(重要):说明数据库执行该 sql 语句具体是干了什么,比如使用了索引就是 using index, 使用了条件查询但是没用到索引:using where 等

    其他取值:
    Using filesort:在排序时使用了外部的索引排序,没用到表内索引进行排序。
    Using temporary:MySQL 需要创建临时表来存储查询的结果,常见于 ORDER BY 和 GROUP BY。
    Using index:表明查询使用了覆盖索引,不用回表,查询效率非常高。Using index condition:表示查询优化器选择使用了索引条件下推这个特性。
    Using where:表明查询使用了 WHERE 子句进行条件过滤。一般在没有使用到索引的时候会出现。


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
  目录