对于大偏移,MySQL需要浏览更多记录.
即使计划使用filesort(这意味着应该浏览所有记录),也要对其MySQL进行优化,以便只对$offset + $limit顶级记录进行排序,这样可以更低效地使用$offset.
典型的解决方案是索引您订购的列,记录列的最后一个值并在后续查询中重复使用,如下所示:
SELECT *
FROM mytable
ORDER BY
value, id
LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud)
哪个输出:
value id
1 234
3 57
4 186
5 457
6 367
8 681
10 366
13 26
15 765
17 345 -- this is the last one
Run Code Online (Sandbox Code Playgroud)
要进入下一页,您将使用:
SELECT *
FROM mytable
WHERE (value, id) > (17, 345)
ORDER BY
value, id
LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud)
,它使用索引(value, id).
当然,这对任意访问页面没有帮助,但有助于顺序浏览.
此外,MySQL对于晚行查找存在某些问题.如果列被编入索引,则可能值得尝试重写您的查询,如下所示:
SELECT *
FROM (
SELECT id
FROM mytable
ORDER BY
value, id
LIMIT $offset, $limit
) q
JOIN mytable m
ON m.id = q.id
Run Code Online (Sandbox Code Playgroud)
有关更详细的说明,请参阅此文章: