MySQL深分页问题

MySQL深分页问题

1. 什么是深分页问题

深分页的性能瓶颈源于MySQL处理LIMIT的机制。当执行:

1
SELECT * FROM tabLe LIMIT 1000000, 20

MySQL需要先定位到第1000000条记录,然后再取出接下来的20条记录。这个过程需要跳过前面的100万条记录,即使有索引,这种跳跃操作的成本也是非常高的。随着偏移量的增加,查询时间会线性增长,这就是深分页问题的根本原因。

2. 深分页问题解决方案

2.1 游标分页

游标分页是解决深分页问题最有效的方案。其核心思想是使用上一页的最后一条记录作为下一页查询的起点,避免了大偏移量的跳跃操作

例如,如果上一页的最后一条记录ID是12345,下一页查询就变成:

1
SELECT * FROM table WHERE id > 12345 ORDER BY id LIMIT 20

这种方式的查询时间复杂度是常数级的,不会随着页数增加而性能衰减。但游标分页也有局限性:无法随机跳转到任意页面,只能顺序翻页

2.2 延迟关联优化

延迟关联优化适用于需要返回大量字段但只按主键排序的场景。其思路是先通过索引查询出符合条件的主键ID,然后再通过主键关联获取完整数据。比如原始查询:

1
SELECT * FROM table ORDER BY created_at LIMIT 100000, 20

可以优化为:

1
2
3
4
5
SELECT t.* FROM table t
JOIN (
SELECT id FROM table ORDER BY created_at LIMIT 100000, 20
) tmp
ON t.id = tmp.id

MySQL深分页问题
http://example.com/2026/01/20/MySQL深分页问题/
作者
Kon4tsu
发布于
2026年1月20日
许可协议