我有下表
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
只比综合指数小一点。
即使我错了,它至少应该使用
索引a
首先,然后使用filesort对b进行排序。
这个排序运算符真的不能使用分隔索引吗?如果是,请解释为什么不起作用。如果没有,您有什么解决方案可以让它与单独的索引一起工作吗?提前谢谢。
编辑
例如,我有100行。我可以用
索引a
首先对它们进行分类。然后在每组中使用相同的
a
价值,我可以用
索引b
把它们分类。
为什么这种方法不能在MySQL上工作?