MySQL 中如何解决深度分页的问题?
2025-05-17 09:34 阅读(84)

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参数)


选择建议


优先考虑子查询方案,特别是当有合适索引时

对于连续浏览场景,记录最大ID方案最简单高效

数据量极大且需要复杂查询时,可考虑搜索引擎方案


作者:超爱吃士力架

链接:https://juejin.cn


https://www.zuocode.com