基于“创建时间(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,避免数据插入/删除导致错位 |
✅ 支持“前后翻页” | 用 < 和 > 运算符灵活控制方向 |
❗ 注意事项
create_time
建立索引(推荐 BTREE)- 如数据精度只到秒,要考虑并发数据写入可能相同时间戳:
- 可使用
(create_time, id)
联合索引 + 联合游标分页:
- 可使用
SELECT *
FROM article
WHERE (create_time, id) > ('2024-05-13 12:30:00', 100001)
ORDER BY create_time, id
LIMIT 10;