在处理大型数据库时,在SQL Where
-clause中,IN
和OR
哪个性能更好?
它们的执行方式有什么不同吗?
发布于 2010-06-19 15:23:33
我假设您想知道以下各项之间的性能差异:
WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'
根据manual for MySQL,如果值是常量,则IN
对列表进行排序,然后使用二进制搜索。我可以想象,OR
会按照没有特定顺序的顺序逐个评估它们。因此,在某些情况下,IN
更快。
了解这一点的最好方法是用您的特定数据来分析这两个数据库,看看哪一个更快。
我在一个有1000000行的MySQL上尝试了这两种方法。当对列进行索引时,在性能上没有明显的差异-两者几乎都是即时的。当列没有索引时,我得到了以下结果:
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%。添加更多的术语会使差异更大。其他数据库和其他数据的结果可能会有所不同。
发布于 2010-06-19 16:07:42
OR运算符需要比IN构造复杂得多的计算过程,因为它允许许多条件,而不仅仅是等于IN。
下面是你可以与OR一起使用,但与IN: greater不兼容的内容。更大或相等、更小、更小或相等、更像或更像oracle REGEXP_LIKE。此外,考虑到条件可能并不总是比较相同的值。
对于查询优化器来说,管理IN运算符更容易,因为它只是一个定义多个条件上的OR运算符和同一值上的=运算符的构造。如果您使用OR运算符,优化器可能不会认为您总是对相同的值使用=运算符,如果它不执行更深入、更复杂的详细说明,它可能会排除在所有涉及的条件下对于相同的值可能只有=运算符,从而排除优化的搜索方法,如前面提到的二进制搜索。
编辑可能优化器可能没有实现优化的IN求值过程,但这并不排除它可能只发生一次(数据库版本升级)。因此,如果您使用OR运算符,那么优化的精化将不会在您的案例中使用。
发布于 2010-06-19 15:27:32
我认为oracle足够聪明,可以将效率较低的那个(无论是哪个)转换为另一个。因此,我认为答案应该取决于每种语言的可读性(我认为IN
显然是赢家)。
https://stackoverflow.com/questions/3074713
复制相似问题