贝利信息

SQL 深度分页的优化方案

日期:2026-01-19 00:00 / 作者:舞夢輝影
深度分页性能差本质是需扫描跳过大量数据,优化核心是避免OFFSET全量扫描,推荐游标分页(基于主键/时间戳)、覆盖索引+子查询、分表归档、分页缓存等方案。

深度分页(比如 OFFSET 1000000 LIMIT 20)在 MyS

QL、PostgreSQL 等主流数据库中性能急剧下降,本质是数据库仍需扫描并跳过前 100 万行。优化核心思路是:避免 OFFSET 的全量扫描,改用基于有序字段的“游标分页”或覆盖索引+子查询等更高效方式。

用主键/唯一有序字段做游标分页(推荐)

适用于数据按主键或时间戳等单调递增字段排序、且前端支持“上一页/下一页”而非跳转任意页的场景。例如按 id 升序分页:

利用覆盖索引 + 子查询减少回表(MySQL 常用)

当必须用 OFFSET 时,先通过覆盖索引快速定位主键,再关联原表取完整数据:

物理分表或归档冷数据

对历史数据占比高、访问集中在近期的业务(如订单、日志),深度分页慢往往是因为单表过大:

缓存分页结果(适合读多写少场景)

对固定条件(如“按销量排行 TOP 10000”)的深度分页,可预计算并缓存结果: