哪两个查询会更快?

时间:2009-12-10 20:59:37

标签: sql query-optimization

SELECT * FROM table WHERE col IN (1,2,3)

SELECT * FROM table WHERE col = 1 OR col = 2 OR col = 3

8 个答案:

答案 0 :(得分:5)

他们是一样的。

编辑:它们在MySQL中是相同的。

使用索引:

mysql> explain select * from trees where id = 1 or id = 2;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | trees | range | PRIMARY       | PRIMARY | 8       | NULL |    2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

mysql> explain select * from trees where id in (1,2);
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | trees | range | PRIMARY       | PRIMARY | 8       | NULL |    2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

使用全表扫描:

mysql> explain select * from trees where version = 1 or version = 2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | trees | ALL  | NULL          | NULL | NULL    | NULL |    7 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

mysql> explain select * from trees where version in (1,2);
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | trees | ALL  | NULL          | NULL | NULL    | NULL |    7 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

答案 1 :(得分:3)

对于大多数RDBMS,查询在执行之前通过优化器进行处理。由于你的谓词在逻辑上是等价的,我希望它们以相同的速度执行,因为它们将被优化以便以相同的方式执行。

但它依赖于数据库。您没有指定您正在使用的引擎。

答案 2 :(得分:2)

这取决于数据库供应商的解释以及它们如何表示where语句。

答案 3 :(得分:2)

在Microsoft SQL Server中,我认为它们的解释方式完全相同。

答案 4 :(得分:2)

可能与否,但确实如此......大多数数据库将前一种语法转换为后者。为什么不呢?它们在逻辑上和功能上完全相同。

请参阅here

答案 5 :(得分:2)

在两者上运行EXPLAIN SELECT ....

答案 6 :(得分:2)

正确的答案是:取决于引擎。使用EXPLAIN检查发生了什么。

某些数据库会将IN表单转换为一系列ORed子句。其他人不会。

例如,Postgres在使用IN表单时会降低(!)成本。

我亲自寻找第一种形式,因为(1)一些引擎可以优化它,(2)它更多 直观,(3)更短。

有些偏离主题:尽管如此,请不要过度使用IN加入桌面。我已经看过很多次这样的构造:

SELECT * FROM employee WHERE boss_id IN(SELECT id FROM boss WHERE some_condition ..)

我猜它的原因是有人选择外部选择,然后通过发出内部选择找出引用表中的条件,然后只是复制&糊。当然这种构造比正确的JOIN更糟糕。

答案 7 :(得分:0)

在这种情况下,查询是等价的,或者第一个查询在测试中会更快一些。 某些优化适用于从子查询中使用IN运算符的比较,而不是这里的情况。