选择最新记录时选择要慢得多

Omi*_*iod 6 php mysql sql limit

一个包含大约70K记录的表格显示在一个站点上,每页显示50条记录.分页limit offset,50在查询上完成,记录可以在不同的列上排序.

浏览最新页面(因此偏移量大约为60,000)使得查询比浏览第一页时慢得多(大约10倍)

这是使用limit命令的问题吗?还有其他方法可以获得相同的结果吗?

Qua*_*noi 7

对于大偏移,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)

有关更详细的说明,请参阅此文章: