【问题标题】:Does limiting a query to one record improve performance将查询限制为一条记录会提高性能吗
【发布时间】:2010-09-07 06:18:17
【问题描述】:

如果表只有一个匹配结果,是否会将查询限制为一条结果记录,从而提高大型(ish)MySQL 表的性能?

例如

 select * from people where name = "Re0sless" limit 1

如果只有一个具有该名称的记录?如果name 是主键/设置为唯一呢?是否值得更新查询或者收益会很小?

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    如果列有

    唯一索引:不,没有更快

    非唯一索引:可能,因为它会阻止发送超出第一个匹配的任何其他行(如果存在)

    无索引:有时

    • 如果有 1 行或更多行与查询匹配,,因为在匹配第一行后将停止全表扫描。
    • 如果没有行匹配查询,,因为它需要完成全表扫描

    【讨论】:

    • 它会阻止全表扫描,还是会导致全表扫描提前停止?如果记录不存在,它仍然需要进行全表扫描。
    • 是的,你是对的。它应该说它“可以”防止全表扫描。我会调整帖子
    • 据我了解,这里重要的是添加限制可能会使您的查询更快,但不会使其变慢。如果不出意外,它还可以将您的意图清楚地传达给未来的开发人员,以防他们不得不调试您的条件不像您想象的那样独特的情况。当我只有一个结果时,我总是添加一个限制子句成为一种习惯。确定一个预先存在的索引是否已经为您完成了这项工作只是在浪费脑力。
    【解决方案2】:

    如果您有一个稍微复杂的查询,带有一个或多个连接,LIMIT 子句会为优化器提供额外信息。如果它希望匹配两个表并返回所有行,hash join 通常是最佳的。哈希联接是一种针对大量匹配进行优化的联接。

    现在,如果优化器知道您已经通过了 LIMIT 1,它就知道它不会处理大量数据。它可以恢复为loop join

    根据数据库(甚至数据库版本),这会对性能产生巨大影响。

    【讨论】:

    • 请查看有关散列连接的内容:虚拟内存中的散列 在多用户系统中,可能不希望专门为散列连接保留大量主内存。因此,哈希表必须驻留在虚拟内存中,并且可以部分写入交换文件。通常,哈希策略的性能会因页面错误而受到严重影响,因为哈希表中的访问模式不显示局部性,因此主内存页面的替换算法(如 LRU)无法与哈希表令人满意地配合使用。
    【解决方案3】:

    按顺序回答您的问题: 1) 是的,如果名称上没有索引。查询将在找到第一条记录后立即结束。取消限制,每次都必须进行全表扫描。 2)没有。主键/唯一键保证是唯一的。查询应在找到该行后立即停止运行。

    【讨论】:

      【解决方案4】:

      我相信 LIMIT 是在找到数据集并且正在构建结果集之后完成的,所以我认为它根本不会产生任何影响。将 name 设为主键将产生显着的积极影响,因为它会导致为列创建索引。

      【讨论】:

        【解决方案5】:

        如果“名称”在表中是唯一的,那么通过对查询设置限制约束,可能仍会(非常非常少)获得性能提升。如果 name 是主键,则可能没有。

        【讨论】:

          【解决方案6】:

          是的,您在处理数据时会注意到性能差异。一条记录比多条记录占用的空间少。除非您要处理许多行,否则这不会有太大区别,但是一旦您运行查询,就必须将数据显示给您,这很昂贵,或者以编程方式处理。无论哪种方式,一条记录都比多条记录容易。

          【讨论】:

            猜你喜欢
            • 2010-10-05
            • 2019-10-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-03
            • 2016-08-25
            相关资源
            最近更新 更多