分页保序能力

最近更新时间:2025-01-21 15:47:02

我的收藏
在 MySQL 中,当查询数据时使用 order by 子句,且 order by 字段存在重复值时,若再结合 limit 子句进行分页查询,可能会出现第二页数据与第一页数据重复的问题。这是因为 MySQL 在排序时使用了堆排的方法,而堆排序是一种不稳定的排序方法,出现重复值时,每一次输出的结果不一致。因此,在使用 order by...limit... 场景的最佳实践是要让 order by 的字段存在索引,或者添加其他字段到 order by 字段中,让数据保持唯一性。
对于此问题,在只读分析引擎中支持了分页保序功能,让用户可以在这种场景下无需关心数据库逻辑,直接使用旧的查询方式依然可以保证 order by...limit... 输出的结果不会出现重复,确保序列的一致性。

实现原理

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

保序场景

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

性能影响

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

使用说明

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