2011-05-02 52 views
1

哪一个性能更快?SQL在WHERE子句中选择IN与LIKE

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

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

,或不作任何区别?

+4

你自己尝试看看?通常这并不重要,但我相信LIKE会变得更慢,因为它不是一个简单的等价测试。 – 2011-05-02 00:37:30

+0

我也投“你试过吗”? – MatBailie 2011-05-02 01:07:28

回答

6

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

+0

-1。你假设字段是索引的,但在问题中没有迹象表明这些字段是;答案是没有根据的。 – casperOne 2011-05-02 01:09:30

+3

@casperOne:他没有这样的假设。答案涵盖了两种情况(带和不带索引),声明如果没有索引,则需要全表扫描,因此性能可能相同。 – MatBailie 2011-05-02 01:15:25

+0

@Dems:我可以看到,但我认为措辞非常具有误导性,事后纠正自己。 – casperOne 2011-05-02 01:16:46

0

我肯定会测试你的平台。一些RDBMS在IN逻辑上非常糟糕,即比你期望的要慢得多。 Mysql有这个问题,你没有在你的问题中指定。

+0

真的吗?大多数SQL(请不要调用SQL“relational”:)将简单地将'IN'子句扩展为'(field5 ='AAL'或field5 ='IAL')',如果您选择的SQL产品无法优化那么是时候去找一个新的! – onedaywhen 2011-05-03 10:24:00

0

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

UPDATE:按照马丁评论,上面是真实的,没有当索引目前为field5,这是该问题的最初假设。

+0

-1这是不正确的。它可能是2个索引在'field5'上搜索的索引扫描。 – 2011-05-02 09:21:42

+0

@Martin,如果有'field5'上的索引,这里甚至不包括讨论的一部分,因为假设没有索引,我的回答是100%正确的,请尝试自己测试 – 2011-05-02 12:36:36

+1

为什么你假设没有索引?如果这是在其上运行的查询的类型,那么可能应该在该列上有索引。 – 2011-05-02 12:39:17

4

如果您没有覆盖索引(或至少是field5上的索引),那么两者都需要进行表扫描,因此会同样很差。

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

关于索引...如果您确实只有field5的索引,那么第二个可能有2个重要的查找来获取其余的数据。第一个可能会忽略此索引,因为它有一个主导通配符。因此,假设事情按我的预期行事,第二个更好。

随着覆盖索引,然后第二人再位无键查找

关于搜索参数...如果你改变IN变量,则计划将再次发生变化。使用常量查询更快,然后使用变量查询,因为使用常量前面已知这些值。

但是,你有没有尝试过...

+0

+1“使用常量查询更快,然后使用变量查询,因为使用常量,数据在前面已知。”好点,而且很少出现。特别是如果数据偏斜(例如95%的男性,5%的女性),这可能会产生可测量的差异。我总是会选择常量,但只能来自非常有限的一组。否则,你最终会“发送垃圾”SQL缓存。在这种情况下,绑定变量会更好。 – Thilo 2011-05-03 01:10:04

0

INLIKE命令更快...

+0

你能解释为什么在这种情况下IN会比LIKE快? – stukelly 2011-05-11 21:34:32