【MySQL】3分钟解决MySQL深度分页问题
什么是深度分页问题?该如何解决呢?这篇文章展开讲讲
什么是深度分页?
当查询结果集非常大时,需要获取靠后页码的数据,比如第1000页、10000页。
如:
SELECT * FROM table LIMIT 10000, 10; -- 获取第10001-10010条记录
深度分页的性能如何?
1.全表扫描:MySQL需要先读取10010行,然后丢弃前10000行
2.内存消耗:临时存储大量中间结果
3.IO压力:需要加载大量数据页到内存
4.响应时间:随着offset(偏移量)增大,查询时间线性增长
二、解决方案对比:
1.游标分页:
原理:记录上一页最后一条记录的ID,作为下一页的查询条件
-- 第一页
SELECT * FROM table ORDER BY id LIMIT 10;-- 后续页(假设上一页最后id=10)
SELECT * FROM table WHERE id > 10 ORDER BY id LIMIT 10;
优点:
- 时间复杂度为O(1)
- 无性能衰减
缺点:
- ID必须是连续自增的
- 不支持跳页
2.延迟关联:
原理:先通过覆盖索引获取ID,再关联原表
SELECT t.* FROM table t
JOIN (SELECT id FROM table ORDER BY col LIMIT 100000, 10) tmp
ON t.id = tmp.id;
优点:
- 减少回表操作
- 比LIMIT快5-10倍
缺点:
- 需要复杂排序的分页
- 不能使用游标分页时