TIDB 复合索引字段order 不同顺序造成全索引遍历

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.1.4
【复现路径】
【遇到的问题:问题现象及影响】
复合索引(key+updated_at) 在搜索的时候使用如下搜索语句

select `key`, updated_at, is_delete from table order by `key` ASC, updated_at DESC

出现了全索引遍历

导致查询非常缓慢

如果两个order 条件都使用同方向的排序,则不会

select `key`, updated_at, is_delete from table order by `key` ASC, updated_at ASC 
或者
select `key`, updated_at, is_delete from table order by `key` DESC, updated_at DESC 

因为索引本身是有序的,默认都是ASC 创建的。现在排序的两个字段要求的不一样,所以需要全扫描后才能反馈出结果

这个从tidb的角度有没有办法优化?这里是优先 key 查询,而且加了 limit

没办法优化,keep order的前提之一就是要求所有排序字段的排序一致。
https://github.com/pingcap/tidb/blob/60eceff04ae62568a8ebd98a545dc90ca5a8ddff/planner/core/find_best_task.go#L617

可以通过CREATE INDEX idx_ab ON t (a ASC,b DESC);
这种方式创建索引尝试一下

tidb 不支持降序索引。索引可以创建成功,但是show create table 就可以看出来实际还是ASC。
mysql 也是在8.0 才支持降序索引。

那只能等tidb后续能够支持了

TIDB(6.5版本止)暂不支持降序索引(类似于 MySQL 5.7),MySQL8.0引入了降序索引(descending index)。这里说的降序索引指的是复合索引才有降序索引一说,如果是单列desc、asc都是一样。

学到了,麦迪

mark

哦豁:100: