explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。
在正常执行的sql语句前加上explain就可以分析改sql语句的执行效率。
本文表结构和数据(文末有sql文件):
字段id表示语句执行的序列号,数值越大优先级越高,同级的情况下,从上往下执行。
这个例子经常用来解释字段id,但是我在mysql8.0版本里面并没有看到其他博客的执行效果。有可能是版本的原因,读者要是知道原因,欢迎留言,不甚感谢。
这里,我是用left join 来解释字段id。
可以看到这个sql先是执行外面的 select * from student st, 然后遇到了left join再去执行了后面的语句,当然后后面的语句会先执行完。
当前执行的表
查询是基于分区表的话,会显示查询将访问的分区
依次从最优到最差分别为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
官方文档
查询可能使用哪些索引来查找。
查询实际上使用哪些索引来查找。
该key_len列指示MySQL决定使用的密钥的长度。的值 key_len使您能够确定MySQL实际使用的多部分键的多少部分。如果该key列显示 NULL,则该key_len 列也显示NULL。在不损失精确性的情况下,长度越短越好。
显示索引的那一列被使用了,如果可能的话,最好是一个常数。哪些列或常量被用于查找索引列上的值。
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好
该filtered列指示将被表条件过滤的表行的估计百分比。最大值为100,这表示未过滤行。值从100减小表示过滤量增加。 rows显示检查的估计行数,rows× filtered显示将与下表连接的行数。例如,如果 rows为1000且 filtered为50.00(50%),则与下表连接的行数为1000×50%= 500。
此列包含有关MySQL如何解析查询的其他信息。
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `studentName` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '小明', '18');
INSERT INTO `student` VALUES ('2', '小黄', '19');
INSERT INTO `student` VALUES ('3', '小红', '19');
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int(11) NOT NULL,
`courseName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', 'math');
INSERT INTO `course` VALUES ('2', 'english');
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(11) NOT NULL,
`studentId` int(11) DEFAULT NULL,
`courseId` int(11) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', '1', '100');
INSERT INTO `score` VALUES ('2', '1', '2', '99');
INSERT INTO `score` VALUES ('3', '2', '1', '99');
INSERT INTO `score` VALUES ('4', '2', '2', '98');
mysql8.0官方文档-explain
butterfly博客