如何告知MySQL数据关联排序,实现二分搜索过滤而非全表扫描?
能否告知MySQL某字段已有序,使其采用二分搜索替代全表扫描?
我想了解是否有办法告诉MySQL,某个字段在过滤前已处于有序状态,让它用二分搜索处理过滤条件,而非执行全表扫描。
举个实际场景:我有一张表,包含id(自增字段)、value、created_at(默认值为CURRENT_TIMESTAMP的时间戳字段)三个字段,对应的查询语句如下:
SELECT * FROM `table` WHERE created_at BETWEEN '2022-10-05' AND '2022-10-06' ORDER BY id
我掌握一个MySQL不知道的上下文信息:当id有序时,created_at必然也是有序的,因此理论上可以通过二分搜索来处理created_at的过滤条件。但MySQL因为不知情,执行了全表扫描——在我的测试数据集里,EXPLAIN显示它扫描了全部50行才返回24条匹配结果,而实际上只需要扫描约log2(50)行即可。小数据量下差异不大,但在大数据量场景中影响会非常显著。
我知道常规解决方案是给created_at添加索引,但实际场景里并非总能实现。比如当已经基于其他索引字段过滤时,无法使用created_at的索引,但此时依然可以基于其他排序规则确定created_at是有序的。
综上,我的问题是:是否存在类似FORCE INDEX的语法,能够告知MySQL我已知该字段是有序的,从而避免全表扫描?
内容的提问来源于stack exchange,提问作者Cruncher
相关产品推荐
相关产品推荐

