游标分页vs传统分页

MySQL

传统分页(页码分页)

这种是最常见的:

1
LIMIT offset, size

例如:

第1页 LIMIT 0,10
第2页 LIMIT 10,10
第3页 LIMIT 20,10

特点:

  • 可以直接跳到 第 N 页

  • offset 会越来越大

  • 深分页会非常慢 (会扫描大量数据)

例如:

LIMIT 9000000,10

数据库必须扫描 900 万行。

游标分页(Keyset Pagination)

例如:

1
2
3
4
5
SELECT *  
FROM tb_sku
WHERE id > last_id
ORDER BY id
LIMIT 10;

特点:

  • 不需要 offset
  • 只依赖 上一页最后一条数据 (所以能上下页来翻页)
  • 可以一直向后翻

例如:

第一页
id > 0

第二页
id > 10

第三页
id > 20

数据库可以:

直接从 B+Tree 定位到 id > last_id 的位置。