使用IN加入或内部选择,哪个更快?

时间:2012-04-17 17:16:58

标签: mysql sql

我想知道INNER JOIN或INNER SELECT与IN?

的速度更快
select t1.* from test1 t1
inner join test2 t2 on t1.id = t2.id
where t2.id = 'blah'

OR

select t1.* from test1 t1
where t1.id IN (select t2.id from test2 t2 where t2.id = 'blah')

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

假设id是关键,这些查询意味着相同的事情,一个体面的DBMS将以完全相同的方式执行它们。不幸的是,MySQL没有,通过扩展"查看执行计划"此SQL Fiddle中的链接。哪一个更快可能取决于表的大小 - 如果TABLE1只有很少的行,那么IN有可能更快,而JOIN在所有其他情况下可能会更快。

这是MySQL查询优化器的一个特点。我从未见过OraclePostgreSQLMS SQL Server执行此类简单的等效查询。

答案 2 :(得分:1)

如果您不得不猜测,INNER JOIN可能比IN (SELECT ...)更有效,但这可能因查询而异。

EXPLAIN关键字是您最好的朋友之一。在完整的EXPLAIN查询前输入SELECT,MySQL将为您提供有关如何执行查询的基本信息。它会告诉你它在哪里使用文件排序,它使用你创建的索引(以及它忽略它们的位置),以及它可能需要检查多少行才能完成请求。

如果其他条件相同,请使用INNER JOIN,因为它更具可预测性,因此更容易理解新的开发人员。但当然,如果您看到IN (SELECT ...)形式的真正优势,用它!

答案 3 :(得分:0)

虽然你必须检查你所询问的任何RDBS上的执行计划,但我猜想inner join会更快或至少相同。如果我错了,也许有人会纠正我。

嵌套选择很可能无论如何都会运行整个内部查询,并构建一个来自test2的可能值的哈希表。如果该查询返回一百万行,则无论如何都会将该数据加载到内存中。

使用内部联接,如果test1只有2行,则可能只会对test2上的每个行的id值进行2次索引扫描,而不是将一百万行加载到内存中。

更现代的数据库系统也可以优化第一个场景,因为它具有每个表的统计信息,但在最好的情况下,内部联接将是相同的。

答案 4 :(得分:0)

在大多数情况下,JOIN比子查询快得多,但子查询比JOIN更易读。

RDBMS针对JOIN创建执行计划,因此可以预测应该加载哪些数据进行处理。这绝对可以节省时间。另一方面,对于子查询,它运行所有查询并加载所有数据以进行处理。

For more details please check this link.