mysql深度分页解决方案

基于“创建时间(create_time)”的位置标记分页是一种高效替代传统 LIMIT offset, size 深度分页方式的解决方案。其核心思想是:用时间戳作为游标,让分页逻辑变为“从哪开始取”而不是“跳过多少行”。


✅ 使用场景

  • 表中有 create_time 字段(或其他递增时间戳)
  • 适合按时间排序的业务,如日志、订单、文章流式加载等

📌 示例表结构

CREATE TABLE article (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255),
  content TEXT,
  create_time DATETIME,
  INDEX idx_create_time(create_time)
);

确保 create_time 有索引。


✅ 第一次分页查询

SELECT * 
FROM article 
WHERE create_time > '1970-01-01 00:00:00'
ORDER BY create_time 
LIMIT 10;

获取第一页,并记录最后一条记录的 create_time,例如:2024-05-13 12:30:00


✅ 下一页查询

SELECT * 
FROM article 
WHERE create_time > '2024-05-13 12:30:00'
ORDER BY create_time 
LIMIT 10;

每次只从上次的时间戳往后取数据


🔁 方向翻页支持

如果需要 向前翻页,可以:

SELECT * 
FROM article 
WHERE create_time < '2024-05-13 12:30:00'
ORDER BY create_time DESC 
LIMIT 10;

然后反转结果顺序返回。


🧠 优点总结

优点说明
🚀 性能稳定查询时间不随页码增加
🧩 支持“更多加载”风格自然适配移动端、滚动加载
🛡️ 减少重复数据或漏数据不使用 offset,避免数据插入/删除导致错位
✅ 支持“前后翻页”<> 运算符灵活控制方向

❗ 注意事项

  1. create_time 建立索引(推荐 BTREE)
  2. 如数据精度只到秒,要考虑并发数据写入可能相同时间戳
    • 可使用 (create_time, id) 联合索引 + 联合游标分页:
SELECT * 
FROM article 
WHERE (create_time, id) > ('2024-05-13 12:30:00', 100001)
ORDER BY create_time, id 
LIMIT 10;

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注