2011-03-11 89 views
8

我可以得到相同的结果这些查询,但哪一个是最快的,最有效的?内连接和where()子句的性能?

哪里in()还是内连接?

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

在短期内加盟避免条款尽可能 – 2011-03-11 15:14:09

+0

MySQL有与'in'和子查询的问题。请参阅http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql – 2011-03-12 01:14:28

回答

12

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

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

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

所以,总之,这取决于。

3


检查性能,执行这两个查询与EXPLAIN SELECT .... 据我所知,INNER JOIN快于IN
顺便说一句什么是你的表引擎的类型MYISAMINNODB

+0

表引擎“MYISAM” – ocanal 2011-03-11 15:25:38

+0

也是一个依赖因素是“索引” – diEcho 2011-03-11 15:47:26

+1

+1提出'解释选择',其中我很惊讶这是唯一的答案表明。 – Seaux 2013-04-08 15:44:25

-2

也还有另一种选择,存在。我是一个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之间没有任何性能差异,对于所讨论列不是NULLABLE的情况。

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