【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倍

缺点:

  • 需要复杂排序的分页
  • 不能使用游标分页时

你可能感兴趣的:(数据库,mysql,数据库)