【问题标题】:SQL Select IN versus LIKE in WHERE clauseSQL 在 WHERE 子句中选择 IN 与 LIKE
【发布时间】:2011-08-16 16:26:30
【问题描述】:

哪个性能更快?

SELECT field1, field2, field3, field4
FROM MyTable
WHERE field5 LIKE '%AL'

SELECT field1, field2, field3, field4
FROM MyTable
WHERE field5 IN ('AAL', 'IAL')

还是没有区别?

【问题讨论】:

  • 您自己尝试过看看吗?通常没关系,但我相信 LIKE 会慢一些,因为它不是一个简单的等价测试。
  • 我也投了“你试过了吗”?

标签: sql select where-clause sql-like


【解决方案1】:

您的里程可能会有所不同,但第二个应该更快,因为它是两个索引支持的查找,而不是完整的索引扫描。如果 field5 上没有索引,则无关紧要(在这两种情况下都进行全表扫描)。

【讨论】:

  • -1。您假设这些字段已编入索引,但问题中没有迹象表明这些字段是;答案是没有根据的。
  • @casperOne :他没有做出这样的假设。答案涵盖了两种情况(有和没有索引),说明没有索引需要全表扫描,因此性能可能是相同的。
  • @Dems:我可以看到,但我认为措辞非常具有误导性,它会在事后纠正自己。
  • @casperOne :语言学的迂腐解构与答案的有效性无关,特别是在您断言它“没有根据”的情况下。更不用说我不同意你的前提并发现答案的语言结构是合法的这一事实。我个人不会阅读一半的答案,并认为后半部分无关紧要。
  • @Dems:赞成票和反对票不仅仅是基于答案是真实陈述的程度,撇开迂腐不谈。可以投票以提高可读性/对它的理解程度。在这种情况下,我认为虽然合法,但它的可读性会受到影响,并且会导致其他人在不应该的地方做出假设(请记住,SO 也是 wiki 的一部分,供那些有同样问题并稍后阅读的人的参考),因此-1。这也没有实际意义,在答案改变之前我不能改变投票。
【解决方案2】:

如果您没有覆盖索引(或至少在 field5 上的索引),那么两者都需要表扫描,因此同样糟糕。

关于查询...第二个与WHERE field5 = 'AAL' OR field5 = 'IAL' 相同,这是要查找的2 个精确值(例如,可能是查找)。 LIKE 和前导通配符意味着“我不知道要查找多少个值”搜索永远不会发生

关于索引... 如果您确实只有 field5 上的索引,那么第二个可能需要 2 个键查找来获取其余数据。第一个可能会忽略此索引,因为它有一个前导通配符。所以第二个更好,假设事情的表现和我预期的一样。

有一个覆盖索引,然后第二个又位无键查找

关于搜索参数...如果将 IN 更改为变量,则计划将再次更改。使用常量的查询比使用变量的查询更快,因为使用常量的值是预先知道的。

但是,你试过了吗……

【讨论】:

  • +1 "使用常量的查询比使用变量的查询更快,因为使用常量的值是预先知道的。"好点,而且很少出现。特别是如果数据有偏差(例如 95% 的男性,5% 的女性),这可能会产生可衡量的差异。我总是选择常量,但前提是它们来自非常有限的集合。否则,您最终会“向 SQL 缓存发送垃圾邮件”。在这种情况下绑定变量会更好。
【解决方案3】:

我肯定会在您的平台上进行测试。一些 RDBMS 在 IN 逻辑方面很糟糕,即比您预期的要慢得多。 Mysql有这个问题,你的问题中没有指定。

【讨论】:

  • 真的吗?大多数 SQL(请不要将 SQL 称为“关系”:)只会将 IN 子句扩展为 (field5 = 'AAL' OR field5 = 'IAL'),如果您选择的 SQL 产品不能很好地优化,那么是时候寻找新的了!跨度>
【解决方案4】:

正如其他所述取决于您选择的 RDBMS,如果您使用的是 MS SQL,则两个语句在性能方面是相同的

更新:根据 Martin 评论,当field5 没有索引时,上述情况属实,这是问题的原始假设。

【讨论】:

  • -1 这不是真的。这可能是在field5 上进行 2 次索引搜索而不是索引扫描。
  • @Martin,只有在field5 上有索引时,您才是正确的,这甚至不是这里讨论的一部分,因为假设没有索引,我的回答是 100% 正确的,尝试自己测试一下
  • 你为什么假设没有索引?如果这是在其上运行的查询类型,则该列上可能应该有一个索引。
  • 多年来我了解到,当事情没有被陈述时,它们就不存在;最好不要假设任何事情。我阅读问题的方式很清楚,我认为没有涉及索引。公平地说,如果该列上有索引,则您的陈述是正确的。我仍然填写降级是不应该的。
  • @K Ivanov - 如果您的回答已经说明了您的假设,我不会否决它。但就目前而言,它做出了笼统的陈述,在某些情况下是完全错误的。
【解决方案5】:

INLIKE 命令快...

【讨论】:

  • 你能解释一下为什么在这种情况下 IN 会比 LIKE 快吗?
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2017-01-31
相关资源
最近更新 更多