文章相关示例执行 基于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语句前面加上关键字EXPLAIN,进行执行,从而得到该SQL的执行信息。
explain select * from tb_book;
字段 | 解释 |
---|---|
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 |
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