2012-07-25 70 views
0

在頁面上我有一個查詢,這是使頁面加載速度下降。查詢優化,而不是在

SELECT * FROM users1 WHERE user_id NOT IN (SELECT user_id FROM users2) 

USERS1是與網站,大量數據的所有用戶表。 USERS2是以下eachother用戶的表格。

所以,我需要選擇一些用戶,這不是跟隨下面。

任何優化方法?

我張貼真正的查詢:上user_id領域

SELECT users.* 
FROM (
    SELECT user_id 
    FROM users 
    WHERE user_id!=156 AND user_id NOT IN (
     SELECT follower_id 
     FROM following 
     WHERE user_id=156 
    ) ORDER BY RAND() LIMIT 2 
) AS temp 
JOIN users ON users.user_id = temp.user_id; 

指標。

查詢花費0.0912秒

此查詢的工作不是用更少的數據測試服務器上的壞,但它需要長達3秒的活之一。

+1

瞭解[SQL連接(http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of -sql-joins.html);並確保你在'user_id'列上有索引。 – eggyal 2012-07-25 12:21:05

回答

0

這應該做的伎倆:

SELECT users1.* FROM users1 
LEFT JOIN users2 on users1.user_id=users2.user_id 
WHERE users2.user_id IS NULL 
+0

'WHERE NOT IN ...' – eggyal 2012-07-25 12:22:55

1

您應該使用LEFT JOIN以獲得最佳性能爲:

SELECT a.* 
FROM users1 a 
    LEFT JOIN users2 b 
     ON a.user_id = b.user_id 
WHERE b.user_id IS NULL; 

也看看Visual explanation of joins

+1

出於好奇:你能否引用爲什麼這應該是MySQL中反連接的更快實現?在更復雜的數據庫(例如Oracle)中,由於有效的查詢轉換,我不認爲會有相關的性能差異... – 2012-07-25 12:26:58

+0

@LukasEder:同意。 [Quassnoi的分析](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)達到了同樣的結論。 – eggyal 2012-07-25 12:28:07

2

LEFT JOIN方式:

SELECT * 
FROM users1 
LEFT JOIN users2 ON users1.user_id = users2.user_id 
WHERE users2.user_id IS NULL 

NOT EXISTS方式:

SELECT * 
FROM users1 
WHERE NOT EXISTS (SELECT 1 FROM users2 WHERE users1.user_id = users2.user_id) 

工作的例子:http://sqlfiddle.com/#!2/611f2/1

+1

出於好奇:您能否引用爲什麼這應該是MySQL中反連接的更快實現?在更復雜的數據庫(例如Oracle)中,由於有效的查詢轉換,我不認爲會有相關的性能差異... – 2012-07-25 12:26:48

+0

從什麼時候起,MySQL是一個複雜的數據庫? :)這些查詢可能會也可能不會更快。 OP鼓勵使用/解釋'EXPLAIN'命令。 – biziclop 2012-07-25 12:28:00

+1

@LukasEder:同意。 [Quassnoi的分析](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)達到了同樣的結論。 – eggyal 2012-07-25 12:28:17