加载中...

深分页(Deep Pagination)指使用 LIMIT n OFFSET m 方式翻页时,随着偏移量 m 增大查询越来越慢的问题:数据库必须先定位并处理前 m+n 行,再丢弃前 m 行,代价与页深成正比。
OFFSET 无法被索引"跳过":即使走索引,引擎也要顺序遍历(甚至逐行回表)前 m 条记录。当 m 达到数十万级,单次翻页可能扫描海量数据,还会放大回表随机 I/O;搜索引擎(如 Elasticsearch 的 from/size)在分布式场景下问题更甚,每个分片都要取前 m+n 条汇总。
主流方案是游标分页(Keyset/Seek Pagination):记录上一页末行的排序键,下一页改用 WHERE (sort_key, id) > (上页末值) ORDER BY sort_key, id LIMIT n,利用索引直接定位起点,每页代价恒定。其代价是不支持随机跳页、要求排序键稳定唯一。MySQL 场景的折中技巧是延迟关联:先在覆盖索引上完成 OFFSET 定位仅取主键,再回表取整行。产品层面则常以"只提供下一页/滚动加载"回避跳页需求。

登录 后参与讨论
暂无讨论,来发表第一条评论吧