在查询中哪些表现更好,'LIKE'或'='?

时间:2011-09-26 06:14:01

标签: sql

我使用的是asp.net mvc3 在我的SQL查询中,两个'=''LIKE'中的哪一个会执行得更快。

5 个答案:

答案 0 :(得分:5)

=将比LIKE更快,因为在SQL中针对完全匹配进行测试的速度更快。 LIKE表达式需要扫描字符串并搜索每行的给定表达式的出现次数。当然,这不是不使用LIKE的理由。数据库已经过优化,除非您发现这是应用程序的性能瓶颈,否则您不应该害怕使用它。做这样的过早优化并不好。

答案 1 :(得分:3)

正如Darin所说,搜索相等可能会更快 - 它允许更好地使用索引等。它部分取决于LIKE操作的类型 - 领先的子串LIKE查询(WHERE Name LIKE 'Fred%')可以在具有狡猾索引的数据库(您需要检查是否需要任何特殊工作才能在数据库中启用它)。跟踪子字符串匹配可能可能以相同的方式进行优化,但我不知道大多数数据库是否处理此问题。任意匹配(例如WHERE Name LIKE '%Fred%Bill%')将非常难以优化。

但是,您应该真正受功能驱动 - 您是否需要基于模式的匹配或完全相等?鉴于他们不做同样的事情,你想要的结果是什么?如果您的LIKE模式没有指定任何通配符,我希望查询优化器能够注意到这一点,并为您提供相应的优化 - 尽管您想要测试这一点。

如果您想知道是否包含模式匹配功能,您需要确定您的用户是否乐意以偶然的“电源搜索”为代价速度 - 不太了解你的用例,很难说......

答案 2 :(得分:2)

Equal和like是不同的运营商,因此无法比较

  • 等于完全匹配
  • LIKE是模式匹配

那就是说,没有通配符的LIKE应该运行相同。但你不会那样做。

这取决于索引。对于任何运算符,每行都需要在没有索引的情况下进行检查。

注意:LIKE '%something'永远不能通过索引进行优化(编辑:参见注释)

答案 3 :(得分:1)

  1. 等于最快
  2. 然后LIKE 'something%'
  3. LIKE '%something'最慢。
  4. 最后一个必须通过整个列才能找到匹配项。因此它是最慢的。

答案 4 :(得分:1)

当你在谈论交替使用它们时,我认为所需的语义是相等的。

即。您正在谈论诸如

之类的查询

WHERE bar = 'foo' vs WHERE bar LIKE 'foo'

这不包含通配符,因此查询在语义上是等效的。但是你应该使用前者作为

  1. 查询的表达式更清楚
  2. 在这种情况下,搜索字词不包含对LIKE运算符特别重要的任何字符,但如果您要搜索bar = '10% off',则在使用LIKE时需要转义这些字符}。
  3. 尾随空间在LIKE查询中很重要,但不是=(在SQL Server和MySQL上测试不确定标准在这里说了什么)
  4. 在SQL Server的情况下,您没有指定RDBMS,只是为了讨论一些可能的场景。

    1。 bar列未编入索引。

    在这种情况下,两个查询都将涉及所有行的完整扫描。 CPU时间可能会有一些细微的差别,因为应该如何处理尾随空间的语义不同。

    2。 bar列具有非唯一索引。

    在这种情况下,=查询将搜索到bar = 'foo'的索引,然后跟随索引,直到找到bar <> 'foo'的第一行。 LIKE查询将搜索跟随索引的bar >= 'foo'索引,直到找到bar > 'foo'

    的第一行为止

    3。 bar列具有唯一索引。

    在这种情况下,=查询将搜索bar = 'foo'所在的索引,并返回该行(如果存在)并且不再扫描。 LIKE查询仍会在Start: bar >= 'foo' End: bar <= 'foo'上执行范围搜索,因此仍会检查下一行。