我想知道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')
答案 0 :(得分:2)
答案 1 :(得分:2)
假设id
是关键,这些查询意味着相同的事情,一个体面的DBMS将以完全相同的方式执行它们。不幸的是,MySQL没有,通过扩展"查看执行计划"此SQL Fiddle中的链接。哪一个更快可能取决于表的大小 - 如果TABLE1
只有很少的行,那么IN有可能更快,而JOIN在所有其他情况下可能会更快。
这是MySQL查询优化器的一个特点。我从未见过Oracle,PostgreSQL或MS 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创建执行计划,因此可以预测应该加载哪些数据进行处理。这绝对可以节省时间。另一方面,对于子查询,它运行所有查询并加载所有数据以进行处理。