1. 面试场景还原与技术挑战拆解
"第100万页怎么查?"这个看似简单的问题,实际上是一场典型的高阶技术压力测试。去年我在某大厂终面时,技术VP突然放下简历,用这个开放式问题打断了我的项目介绍。当时会议室空调很足,但我后背瞬间湿透——因为这个问题直指分页查询这个基础功能的性能天花板。
大多数开发者对分页的认知停留在LIMIT 10 OFFSET 20这样的基础语法层面。但当数据量达到千万级时,传统分页方案会暴露出致命缺陷。以MySQL为例,执行SELECT * FROM table LIMIT 10 OFFSET 999990时,数据库实际上需要先扫描前999990条记录,这种线性时间复杂度(O(n))的查询在百万级偏移量下必然导致性能雪崩。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 传统分页的性能瓶颈与原理分析
2.1 数据库分页的底层工作机制
当执行带有OFFSET的分页查询时,数据库引擎的工作流程如下:
- 解析SQL并构建执行计划
- 从存储引擎读取满足条件的所有行
- 逐条计数直到跳过OFFSET指定的行数
- 返回后续LIMIT条记录
这个过程中最耗时的部分是第三步的线性扫描。我曾用Percona工具监控过一个800万行表的查询:OFFSET 7000000的查询需要读取7MB的索引数据,即使使用覆盖索引也无法避免全表扫描。
2.2 真实业务场景的压力测试
在电商订单系统中,我们模拟了不同分页方案的性能对比:
| 数据量 | 查询方式 | 平均耗时 | 内存消耗 |
|---|---|---|---|
| 10万行 | LIMIT 50 OFFSET 99950 | 120ms | 45MB |
| 100万行 | LIMIT 50 OFFSET 999950 | 1.2s | 450MB |
| 1000万行 | LIMIT 50 OFFSET 9999950 | 12s | 4.5GB |
这个测试揭示了一个残酷事实:传统分页的性能与数据量呈线性正比,当数据量增长10倍时,查询耗时同步增长10倍。
3. 高性能分页的工程解决方案
3.1 游标分页(Cursor Pagination)
游标分页通过记录最后一条记录的位置标识来实现分页。以Twitte
