[英]Select is much slower when selecting latest records
一个包含大约70K记录的表格显示在一个站点上,每页显示50条记录。 在查询中使用limit offset,50
进行分页,并且可以在不同列上对记录进行排序。
浏览最新页面(因此偏移量大约为60,000)使得查询比浏览第一页时慢得多(大约10倍)
这是使用limit
命令的问题吗? 还有其他方法可以获得相同的结果吗?
对于大偏移量, MySQL
需要浏览更多记录。
即使计划使用filesort
(这意味着应该浏览所有记录), MySQL
也会对其进行优化,以便只对$offset + $limit
top记录进行排序,这使得$offset
较低值更有效。
典型的解决方案是索引您订购的列,记录列的最后一个值并在后续查询中重复使用,如下所示:
SELECT *
FROM mytable
ORDER BY
value, id
LIMIT 0, 10
哪个输出:
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
要进入下一页,您将使用:
SELECT *
FROM mytable
WHERE (value, id) > (17, 345)
ORDER BY
value, id
LIMIT 0, 10
,它使用索引(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
有关更详细的说明,请参阅此文章:
这就是MySQL处理限制的方式。 如果它可以对索引进行排序(并且查询足够简单),它可以在找到第一个offset + limit
行后停止搜索。 所以LIMIT 0,10
意味着如果查询足够简单,它可能只需要扫描10行。 但是LIMIT 1000,10
意味着它至少需要扫描1010行。 当然,需要扫描的实际行数取决于许多其他因素。 但这里的要点是limit + offset
越低,需要扫描的行数下限就越低......
至于变通方法,我会优化您的查询,以便没有LIMIT
子句的查询本身尽可能高效。 在这种情况下, EXPLAIN
是你的朋友......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.