内连接和in()子句的性能在哪里?

时间:2011-03-11 15:11:19

标签: mysql sql inner-join

我可以为这些查询获得相同的结果,但哪一个是最快,最有效的?

in()或inner join?

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
INNER JOIN users
ON `stats`.`userid` = `users`.`userid` 
WHERE `users`.`nick` =  '$nick'

ORDER BY `statoylar`.`sumpoint` DESC  limit 0,10

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
WHERE userid
IN (
SELECT userid
FROM  `users` 
WHERE  `users`.`nick` =  '$nick'
)
ORDER BY `stats`.`sumpoint` DESC  limit 0,10

3 个答案:

答案 0 :(得分:13)

取决于您的SQL引擎。具有合理查询优化器的较新SQL系统很可能会将两个查询重写为同一计划。通常,使用连接(第一个查询)重写子查询(第二个查询)。

在可能没有很好的查询优化器的简单SQL引擎中,连接应该更快,因为它们可以在运行外部查询之前将子查询运行到临时内存表中。

在一些内存占用有限的SQL引擎中,子查询可能更快,因为它不需要加入 - 这会产生更多数据。

总而言之,这取决于。

答案 1 :(得分:3)


        检查性能是否使用EXPLAIN SELECT ....执行查询 AFAIK,INNER JOININ更快 顺便说一下你的表引擎MYISAMINNODB

的类型是什么

答案 2 :(得分:-2)

还有另一个选项,EXISTS。我是一个tsql的家伙......

SELECT s.[userid], s.[sumpoint] 
FROM stats AS s
WHERE
     EXISTS (
     SELECT 1
     FROM users AS u
     WHERE
         u.[userID] = s.[userID]
         AND u.[nick] = '$nick'
     )
ORDER BY s.[sumpoint] DESC

我认为大多数引擎都可以使用EXISTS。它通常很快。

在sql server中至少(2005+),对于有问题的列不可用的情况,IN和EXISTS之间根本没有性能差异。

可能无关紧要但是嘿.....