【发布时间】:2019-01-17 07:36:52
【问题描述】:
我有下表
CREATE TABLE `test` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL
);
我需要做以下查询
SELECT * FROM `test` ORDER BY a, b LIMIT 1;
如果我添加一个复合索引
ALTER TABLE `t_test` ADD INDEX a_b(`a`, `b`);
有效
> EXPLAIN SELECT * FROM `test` ORDER BY a, b LIMIT 1;
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | test | index | NULL | a_b | 8 | NULL | 1 | |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
但是如果我分别添加两个索引
ALTER TABLE `t_test` ADD INDEX a(`a`), ADD INDEX b(`b`);
失败了
> EXPLAIN SELECT * FROM `test` ORDER BY a, b LIMIT 1;
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 2 | Using filesort |
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
即使我添加FORCE INDEX,它也不起作用。
据我个人理解,它应该同时使用index a 和index b,并且比复合索引小一点。
即使我错了,它至少应该先使用index a,然后使用filesort对b进行排序。
这种排序运算符真的不能使用分隔索引吗?如果是,请解释为什么它不起作用。如果没有,您是否有任何解决方案让它与单独的索引一起使用?提前致谢。
编辑
例如,我有 100 行。我可以先使用index a 对它们进行排序。然后在每个具有相同a 值的组中,我可以使用index b 对它们进行排序。
为什么这种方式不能在 MySQL 上工作?
【问题讨论】: