【问题标题】:Does additional SQL search criteria reduce or improve performance?额外的 SQL 搜索条件是否会降低或提高性能?
【发布时间】:2021-12-17 06:14:12
【问题描述】:

我有一个巨大的数据库,其中包含人们的数据,包括(唯一的)姓名、所在国家/地区、出生日期等。我想通过以下方式在这个庞大的数据库中搜索人员列表:

SELECT * FROM table1 WHERE
   NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie'

鉴于这个数据集的大小,显然我在 WHERE 子句中包含的人越多,查询所需的时间就越长。可以说,我知道我要找的人位于英国。在我的查询中包含国家会减少搜索时间吗? SQL 会知道根据国家/地区缩小表格会减少搜索我想要的所有这些人的时间吗?或者它实际上只是它需要寻找的附加标准,从而降低性能?当有多个 OR、AND 部分时,SQL 如何知道哪个顺序最有效?我修改后的查询是:

SELECT * FROM table1 WHERE
    COUNTRY = 'UK' AND (NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie')

这样会更快吗?

编辑:我没有提到的另一件事是没有索引

【问题讨论】:

  • 取决于索引等
  • 最初没有索引
  • 那会是个问题...
  • 您能详细说明一下吗?
  • @minh98 - 研究索引及其功能/目的

标签: mysql sql performance


【解决方案1】:

如果该表没有您所说的索引,那么您搜索中的术语实际上是无关紧要的。无论如何,搜索都会检查每一行。也就是“表扫描”。

一旦查询检查了给定的行,它至少需要评估一些搜索词。但是获取一行来检查的成本远远高于您显示的搜索字词。

以此类推:假设您在电话簿中搜索。您决定以蛮力的方式搜索,阅读书中的每一页。所以现在你要问的是搜索一个名字还是三个名字的成本更高。答案是,您要花更多的时间阅读书中的每一页,而不是根据字母顺序进行有效搜索,而微优化要搜索的名称似乎很愚蠢。

您最好在这对列上添加一个索引:(COUNTRY, NAME) 按此顺序。然后优化器将立即将搜索范围缩小到COUNTRY='UK' 所在的行组,并在其中对少数名称进行范围搜索。

就像您在电话簿中搜索一个特定的LAST_NAME 和三个不同的FIRST_NAMEs。利用本书的排序顺序会对您有很大帮助。

您可能会喜欢我的演示文稿How to Design Indexes, Really,或video

【讨论】:

    【解决方案2】:

    包含更多条件实际上会加快您的查询结果。您要查找的数据越精确,需要返回的数据就越少。如果我正在寻找约翰。如果我只看德克萨斯,那么约翰的名单就会少得多。

    这里是关于查询性能的 Microsoft pdf 的链接: https://info.microsoft.com/rs/157-GQE-382/images/EN-GB-CNTNT-eBook-DBMC-SQL-Server-performance-faster-querying-with-SQL-Server%20%281%29.pdf

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    你可以简化

    NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie'
    

    NAME IN ('Alice', 'Bob','Charlie')
    

    第一个查询将受益于

    INDEX(name)
    

    第二个将受益更多

    INDEX(country, name)
    

    如果没有合适的索引,它将读取并查看“这个庞大的数据库”中的每一行。有了合适的索引,它可以跳到索引中的正确位置,读取几行,然后在数据中查找它们。更快。

    另外,一定要有PRIMARY KEY

    【讨论】:

      【解决方案4】:

      如果你不想给表添加索引,那么答案很简单:

      包含所有条件的查询将通过一次全表扫描得到解决,并将返回您想要的所有行。

      现在,如果您可以添加索引,则可以使用 UNION ALL 组合查询以实现高性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        相关资源
        最近更新 更多