分页保序能力

最近更新时间:2025-04-15 15:38:42

我的收藏
在 MySQL 中,当查询数据时使用 order by 子句,且 order by 字段存在重复值时,若再结合 limit 子句进行分页查询,可能会出现第二页数据与第一页数据重复的问题。这是因为 MySQL 在排序时使用了堆排序的方法,而堆排序是一种不稳定的排序方法,当排序的字段存在重复值时,每一次排序输出的结果可能会不一致。特别是在并行执行 SQL 时,多线程排序会导致排序结果更加不稳定。因此,在使用 order by ... limit ... 场景的推荐做法是要让 order by 的字段存在索引,或者添加其他字段到 order by 字段中,让数据保持唯一性。
而只读分析引擎为了避免此问题的出现,支持了分页保序功能。分页保序可以让用户可以无需关心数据库的实现逻辑,即使排序字段存在重复,order by ... limit ... 输出的结果也不会出现重复,确保了序列的一致性。

实现原理

只读分析引擎会在确保业务排序逻辑后,默认对全量数据进行隐式排序。这样就避免了使用 limit 操作时带来的数据重复问题。

保序场景

无 order by 操作符,仅仅有 limit 的场景。
order by 字段存在重复值。
子查询中包含排序,但是外层查询中未进行排序。

性能影响

在打开分页保序功能后,会引入额外的排序操作,故部分查询可能会出现性能回退。请根据业务的实际情况选择是否使用分页排序能力。

使用说明

分页保序的开启和使用介绍详情请参考 分页保序功能