最近在看周阳的 Mysql 视频学习如何优化索引 ,对其中的一个例子始终疑惑,没找到答案,我比较菜,对 mysql 的 innodb 引擎还没有深入理解学习,所以只能依据一些简单的规则结论来分析问题,还望大佬解释的时候稍微简单一点
假如对表 table ( a,b,c) 建立复合索引 index(a,b)
有如下 case
select a,b order by a 不会产生 filesort
select a,b order by b 会产生 filesort
select a,b order by a,b 不会产生 filesort
select a,b order by b,a 会产生 filesort
select a,b where a=? 能用到索引
select a,b where b=? 用不到索引
这里涉及到的结论有
我的问题就是下面这条语句为什么还能使用索引排序不产生 filesort
select a,b where b > ? order a
我认为这条语句有几个问题会无法使用索引才对:
完整的建表语句和 问题 sql 执行 explain 结果
CREATE TABLE `tbla` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) NULL DEFAULT NULL,
`birth` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
`name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`test` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_A_ageBirth`(`age`, `birth`, `name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of tbla
-- ----------------------------
INSERT INTO `tbla` VALUES (1, 22, '2020-06-10 21:51:42', 'abc', NULL);
INSERT INTO `tbla` VALUES (2, 23, '2020-06-10 21:51:42', 'bcd', NULL);
INSERT INTO `tbla` VALUES (3, 24, '2020-06-10 21:51:42', 'def', NULL);
SET FOREIGN_KEY_CHECKS = 1;
问题 Sql explain
1
senninha 2020-06-11 11:11:06 +08:00
select a,b where b > ? order a
这个是 order by a 先借助索引(a,b)取出有序数据,然后再 where 筛选结果,确实不需要 filesort 啊。 |
2
bluehr OP @senninha 这里我一直以为是先执行 Where 条件后再执行 排序操作的。 如果这个表特别大,先取出有序序列岂不是先加载了大量数据后再进行筛选
|