以下两个命令有什么区别?
SELECT * FROM table WHERE id IN (id1, id2, ..., idn)
和
SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn
哪一个更快?如果id
是另一种类型,它会有所不同吗?
答案 0 :(得分:12)
它们在语义上相同。
IN
只是第二个示例中的一系列相等语句的简写。表现也应该相同。
类型无关紧要,它总是会评估为一系列等式。
使用NOT IN
和数据NULL
时会有所不同,但NULL
对NOT IN
比较不会评估为false,所以你可能会得到你在结果集中没有想到的行。
举个例子:
SELECT 'Passed!' WHERE NULL NOT IN ('foo', 'bar')
即使面值NULL
不是'foo'
或'bar'
,上述查询也不会返回一行 - 这是因为NULL
是一个未知状态,而SQL不能肯定地说未知值是不 IN
列出的值之一。
答案 1 :(得分:1)
这取决于特定的DBMS优化器实现和引擎本身。
但是你应该认为它们在语义上相似并且以类似的方式进行优化,你应该没问题。
优化不依赖于字段类型
答案 2 :(得分:1)
至少在sqlserver中都给出了相同的执行计划!!!
答案 3 :(得分:0)
由于数据结构的原因,每个DBMS足够可靠地预先形成IN运算符。 此外,当db计算sql计划时,它不一定将OR表单转换为IN表单,只是因为OR运算符可以完全组合不同的条件。 从逻辑角度来看,它们完全相同。
答案 4 :(得分:-3)
我认为IN更快,因为您提供了一个服务器可以处理的简单查询。 只是我的想法。
请参阅Fernando Giovanini在本文中的以下评论,他提到IN使其不仅更具可读性而且更快:http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries#comment-325677194