我可以为这些查询获得相同的结果,但哪一个是最快,最有效的?
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
答案 0 :(得分:13)
取决于您的SQL引擎。具有合理查询优化器的较新SQL系统很可能会将两个查询重写为同一计划。通常,使用连接(第一个查询)重写子查询(第二个查询)。
在可能没有很好的查询优化器的简单SQL引擎中,连接应该更快,因为它们可以在运行外部查询之前将子查询运行到临时内存表中。
在一些内存占用有限的SQL引擎中,子查询可能更快,因为它不需要加入 - 这会产生更多数据。
总而言之,这取决于。
答案 1 :(得分:3)
检查性能是否使用EXPLAIN SELECT ....
执行查询
AFAIK,INNER JOIN
比IN
更快
顺便说一下你的表引擎MYISAM
或INNODB
答案 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之间根本没有性能差异。
可能无关紧要但是嘿.....