2012-03-01 29 views
1

我試圖從該會話ID按照用戶檢索的博客ID的:在這兩個表查詢中性能更好?

SELECT * FROM articles 
WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id') 

這給了我預期的結果,但是表現非常糟糕,即使有少量的行。

加入我會更好嗎?

+4

不要使用'SELECT *' - 只返回絕對需要的列。有些等待時間可能來自查詢結果中無關信息的網絡流量。 – 2012-03-01 02:08:13

+1

是的。即使你需要所有列,最好列出你想要的。這樣你就可以添加字段或改變他們的順序,你的程序仍然有效。 – MPelletier 2012-03-01 02:09:56

+0

將它重寫爲連接真的很容易。你會得到什麼結果?它仍然很慢嗎? – 2012-03-01 02:17:16

回答

5

,可以快速的改寫解決這個問題:

SELECT * FROM articles WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id' AND id_usuario = toid) 

有了您的查詢,MySQL將嘗試先兌現外部查詢(選擇所有的文章),然後根據內部查詢,這是不過濾高效,但不幸的是,現在還不夠聰明,意識到它應該將該子查詢變爲聯接。

您可以爲優化程序提供它需要的提示,不過通過在內部表中引用您要過濾的條件的外部表,就像我上面所做的那樣。

+1

是的,[相關的子查詢](http://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html)是這裏工作的想法。 – 2012-03-01 02:10:44

+0

巧妙的把戲。我喜歡! – MPelletier 2012-03-01 03:16:21

3

即使對於這樣一個簡單的查詢,如果聯接提供更好的性能,那將是非常令人驚訝的。

我可以建議的一件事是id_usuario上的索引。

此外,要分析引擎對您的查詢所做的操作,請使用Explain

+0

+1提及索引,並提示說明。 – 2012-03-01 02:29:33