MySQL 中如何解决深度分页的问题?

732 阅读1分钟

MySQL 深度分页问题解决方案总结

什么是深度分页问题

深度分页是指当数据量很大时,查询靠后的分页数据(如 limit 99999990, 10),数据库需要扫描前面的99999990条记录才能返回最后的10条数据,这会显著增加数据库负载,影响性能。

解决方案

1. 子查询优化

SELECT * FROM lzhhh 
WHERE name = 'HH' 
AND id >= (SELECT id FROM lzhhh WHERE name = 'HH' ORDER BY id LIMIT 99999990, 1)
ORDER BY id LIMIT 10;

原理

  • 先通过子查询在二级索引(name)上快速定位到起始ID(二级索引数据量小且无需回表)
  • 再用该ID在主键索引上查询具体数据
  • 也可以改用JOIN实现相同效果:
SELECT * FROM lzhhh
INNER JOIN (SELECT id FROM lzhhh WHERE name = 'HH' ORDER BY id LIMIT 99999990, 10) AS lzhhh1
ON lzhhh.id = lzhhh1.id

2. 记录最大ID(连续分页优化)

  • 每次分页返回当前页的最大ID
  • 下次查询使用 WHERE id > max_id LIMIT 10
  • 限制:仅适用于连续分页场景,无法直接跳转到任意页码

3. 使用搜索引擎(如Elasticsearch)

  • 考虑使用ES等搜索引擎处理大量数据的分页
  • 注意:ES自身也有深度分页问题(需了解scroll API或search_after参数)

选择建议

  1. 优先考虑子查询方案,特别是当有合适索引时
  2. 对于连续浏览场景,记录最大ID方案最简单高效
  3. 数据量极大且需要复杂查询时,可考虑搜索引擎方案