首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL WHERE子句中的IN vs OR

SQL WHERE子句中的IN vs OR
EN

Stack Overflow用户
提问于 2010-06-19 15:17:20
回答 4查看 136.9K关注 0票数 176

在处理大型数据库时,在SQL Where-clause中,INOR哪个性能更好?

它们的执行方式有什么不同吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-19 15:23:33

我假设您想知道以下各项之间的性能差异:

代码语言:javascript
复制
WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'

根据manual for MySQL,如果值是常量,则IN对列表进行排序,然后使用二进制搜索。我可以想象,OR会按照没有特定顺序的顺序逐个评估它们。因此,在某些情况下,IN更快。

了解这一点的最好方法是用您的特定数据来分析这两个数据库,看看哪一个更快。

我在一个有1000000行的MySQL上尝试了这两种方法。当对列进行索引时,在性能上没有明显的差异-两者几乎都是即时的。当列没有索引时,我得到了以下结果:

代码语言:javascript
复制
SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)

因此,在这种情况下,使用OR的方法大约要慢30%。添加更多的术语会使差异更大。其他数据库和其他数据的结果可能会有所不同。

票数 204
EN

Stack Overflow用户

发布于 2010-06-19 16:07:42

OR运算符需要比IN构造复杂得多的计算过程,因为它允许许多条件,而不仅仅是等于IN。

下面是你可以与OR一起使用,但与IN: greater不兼容的内容。更大或相等、更小、更小或相等、更像或更像oracle REGEXP_LIKE。此外,考虑到条件可能并不总是比较相同的值。

对于查询优化器来说,管理IN运算符更容易,因为它只是一个定义多个条件上的OR运算符和同一值上的=运算符的构造。如果您使用OR运算符,优化器可能不会认为您总是对相同的值使用=运算符,如果它不执行更深入、更复杂的详细说明,它可能会排除在所有涉及的条件下对于相同的值可能只有=运算符,从而排除优化的搜索方法,如前面提到的二进制搜索。

编辑可能优化器可能没有实现优化的IN求值过程,但这并不排除它可能只发生一次(数据库版本升级)。因此,如果您使用OR运算符,那么优化的精化将不会在您的案例中使用。

票数 11
EN

Stack Overflow用户

发布于 2010-06-19 15:27:32

我认为oracle足够聪明,可以将效率较低的那个(无论是哪个)转换为另一个。因此,我认为答案应该取决于每种语言的可读性(我认为IN显然是赢家)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3074713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档