【问题标题】:Is using LIMIT and OFFSET in MySQL less expensive than returning the full set of records?在 MySQL 中使用 LIMIT 和 OFFSET 是否比返回完整记录集便宜?
【发布时间】:2011-07-02 14:33:12
【问题描述】:

这可能是一个愚蠢的问题,但我只是对幕后发生的事情感到好奇。

如果我想对数据库记录进行分页,我可以使用 LIMIT 和 OFFSET 或者直接获取所有记录并使用更多代码推断我想要的记录。

我知道第二种选择绝对傻,我只是想知道它是否更贵

如果我使用 LIMIT 和 OFFSET,数据库会抓取我所要求的内容,还是会在内部获取与我的查询匹配的所有记录(甚至数十万条),然后在内部使用起始索引 (OFFSET) 和结束索引 ( OFFSET + LIMIT) 来获取请求的记录子集?

我什至不知道我是否用正确的词来描述我的疑问,我希望有人能解释一下。

谢谢!

【问题讨论】:

    标签: mysql sql limit offset


    【解决方案1】:

    是的,它会更贵,原因有两个。

    1) Mysql 将在内部进行优化,只计算它需要的行,而不是在内部全部检索它们。请注意,如果您在查询中有 order by,则此优化要少得多,因为 mysql 必须匹配和排序数据集中的所有行,而不是在找到限制中的第一个 X 时停止。

    2) 当所有记录都返回时,它们都需要通过网络从数据库传输到您的应用程序服务器。这可能需要时间,尤其是对于中型到大型数据集。

    【讨论】:

    • 很好的答案,并且很好地调用了 order by,但是大多数时候(尤其是当我们有 limit 和 offset 大多数时候假设分页环境时)我们确实需要对查询进行排序。但同样,很好的答案,非常感谢
    • 根据您构建查询的方式,order by 可能会或可能不会要求数据库生成比它必须返回的行更多的行。如果在用于订单的索引和结果行数之间存在可靠的 1 对 1 对应关系,例如,如果相同的列同时出现在 order by 和 group by 子句中,则数据库 可能能够跳过被偏移量修剪掉的行。至少,如果查询可以围绕用于订单的同一索引进行规划,则不需要生成被限制修剪的尾随行。
    • TokenMacGuy有一个好点,可以优化索引匹配结果,作为特例,优化处理。
    • 所以,假设我有一个场景,出于充分的理由,我需要返回完整的可用记录集,然后进行一些处理并对结果进行分页,什么数字可以让我保持安全边?这意味着:与限制偏移方法相比,我可以安全地从查询返回多少记录到应用程序,知道它不会昂贵到成为问题?
    • 像大多数基于性能的问题一样,回答它的唯一方法是测试它。尝试一种设置,看看效果如何。然后调整设置并重试。
    【解决方案2】:

    差异可能很大。不仅有时网络差异很大(几行与数百到数千行),而且数据库需要查找的行数也可能很大。例如,如果您要求 10 行,则数据库可以在找到 10 行后停止,而不必检查每一行。

    尽可能使用 LIMIT 和 OFFSET。

    【讨论】:

    • 感谢您的回答,目前我正在想办法做到这一点,但我的情况有点复杂:案例 Wordpress网站,我是建立一个照片库,我有分页,帖子视图(查看包含照片的帖子列表)和图像视图(你会在同一页面中看到来自这些帖子的完整照片列表,也分页)。我是 1 ) 检索照片类别中的所有帖子 2) 检索属于第 (1) 点的帖子子项的所有图像附件帖子 3) 显示正确的内容、正确的布局以及使用 php 逻辑的正确分页
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2013-04-03
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多