2011-03-11 92 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的情況。

可能無關緊要,但嘿.....