一文读懂MySQL执行计划 Explain

MySQL执行计划 Explain

文章相关示例执行 基于MySQL(8.0.13)版本

定义

官方文档描述的定义如下:

The set of operations that the optimizer chooses to perform the most efficient query is called the “query execution plan”, also known as the EXPLAIN plan.

MySQL优化器选择执行最有效的查询的一组操作称为“查询执行计划”,也称为解释计划。

执行计划为MySQL内部优化器通过计算耗费等分析后,所选择其认为最优的一种sql执行步骤或者信息。

用途

通过查看执行计划,可以识别出SQL语句中的表连接、执行顺序以及索引使用情况等,从而调整低效SQL写法,从而提升SQL执行性能。执行计划可以看出如下信息,以便我们进行sql调整,是进行sql优化的一个比较好的工具以及依据。

  • 查看表连接顺序及相关信息
  • 查看索引使用情况
  • 查看SQL执行的排序、可能扫描的行数情况

用法

通过在SQL语句前面加上关键字EXPLAIN,进行执行,从而得到该SQL的执行信息。

explain select * from tb_book;

在这里插入图片描述

  • EXPLAIN 适用于 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 语句。
  • EXPLAIN SQL语句,并不会真正执行SQL语句内容,而是显示语句的执行计划信息。
  • 对于SELECT 语句,EXPLAIN会生成额外的执行计划信息,这些信息可以使用"show warnings"来查看。

EXPLAIN字段释义概览

字段 解释
id SELECT查询标识。数值型,用来表示SQL语句中片段或操作表的执行顺序数值越大越优先执行,相同则由上向下执行
select_type select子句查询的类型标识查询类别的归属是简单查询、主要查询、联合查询、子查询等其中的类型。常见主要有下面几种类型。SIMPLE、PRIMARY、UNION、 UNION RESULT、SUBQUERY、DERIVED
table 输出结果行的表/当前访问的表。有可能是其它查询表的联合结果或某表衍生
partitions 查询结果的分区。如果没有分区,值为null
type 查询的连接类型。性能好坏的重要指标。性能由好到差的取值为null > system > const > eq_ref > ref > range > All
possible_keys 可能用到的索引
key 实际用到的索引
key_len 用到的索引字节长度
ref 如使用到索引,标识具体哪一列使用,有可能为const
rows 预估获取到结果需扫描的行数。如果数值巨大,可以作为考虑是否要进行优化
filtered 根据表过滤条件的筛选行的百分比,即经过查询条件过滤后剩余记录条数百分比
Extra 额外的信息,如Using fileSort

本次用到的演示表的定义和数据如下:
一文读懂MySQL执行计划 Explain_第1张图片

DROP TABLE IF EXISTS `tb_author`;
CREATE TABLE `tb_author`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `gender` int(11) NOT NULL COMMENT '性别',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `tb_author` VALUES (1, '小A', 25, 1);
INSERT INTO `tb_author` VALUES (2, '小B', 32, 0);
INSERT INTO `tb_author` VALUES (3, '小C', 35, 1);
INSERT INTO `tb_author` VALUES (4, '小D', 34, 0);
INSERT INTO `tb_author` VALUES (5, '小E', 26, 0);
INSERT INTO `tb_author` VALUES (6, '小F', 24, 1);
INSERT INTO `tb_author` VALUES (7, '小G', 30, 0);
INSERT INTO `tb_author` VALUES (8, '小H', 20, 0);
INSERT INTO `tb_author` VALUES (9, '小J', 20, 1);
INSERT INTO `tb_author` VALUES (10, '小K', 32, 0);

DROP TABLE IF EXISTS `tb_book`;
CREATE TABLE `tb_book`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 

你可能感兴趣的:(数据库,后端,sql,mysql,spring,spring,boot)