MySQL 深度分页怎么优化?
引言
分页查询是数据库应用中常见的需求,不同的分页方式对性能影响显著。逐页翻页通过记录上次查询的最大ID,避免了大量的偏移扫描,适合顺序浏览;而基于页数的直接跳页查询则面临主键不连续和偏移量过大的性能瓶颈。本文将介绍这两种分页方式的实现方法及性能特点,帮助开发者根据业务场景选择更高效的分页策略。
逐页翻页
这种情况比较好处理,只需要记录上页中最大的id,然后下次查询时把max_id传给接口。
select * from your_table where id > max_id order by created limit 100;
输入页数翻页
不能依赖于排序字段是连续的,因为主键会有各种原因导致不连续(insert 报错导致自增键没回滚、insert select是逐渐递增的方式申请,2 4 8 16 32...)。
-- 方法一,通过子查询查出第10000000条数据id
SELECT * FROM your_table
WHERE id > (SELECT id FROM your_table ORDER BY created LIMIT 1 OFFSET 10000000)
ORDER BY created LIMIT 10;
-- 方式二,直接分页查询
SELECT * FROM your_table ORDER BY created LIMIT 10000000, 10;
方式一的效率要高于方式二,方式一的子查询会使用rowId排序方式,可以在内存中加载更多的数据,找到第10000000条数据id更快。
感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!