我試圖從該會話ID按照用戶檢索的博客ID的:在這兩個表查詢中性能更好?
SELECT * FROM articles
WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id')
這給了我預期的結果,但是表現非常糟糕,即使有少量的行。
加入我會更好嗎?
我試圖從該會話ID按照用戶檢索的博客ID的:在這兩個表查詢中性能更好?
SELECT * FROM articles
WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id')
這給了我預期的結果,但是表現非常糟糕,即使有少量的行。
加入我會更好嗎?
,可以快速的改寫解決這個問題:
SELECT * FROM articles WHERE id_usuario IN (SELECT toid FROM follows WHERE fromid = '$id' AND id_usuario = toid)
有了您的查詢,MySQL將嘗試先兌現外部查詢(選擇所有的文章),然後根據內部查詢,這是不過濾高效,但不幸的是,現在還不夠聰明,意識到它應該將該子查詢變爲聯接。
您可以爲優化程序提供它需要的提示,不過通過在內部表中引用您要過濾的條件的外部表,就像我上面所做的那樣。
是的,[相關的子查詢](http://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html)是這裏工作的想法。 – 2012-03-01 02:10:44
巧妙的把戲。我喜歡! – MPelletier 2012-03-01 03:16:21
+1提及索引,並提示說明。 – 2012-03-01 02:29:33
不要使用'SELECT *' - 只返回絕對需要的列。有些等待時間可能來自查詢結果中無關信息的網絡流量。 – 2012-03-01 02:08:13
是的。即使你需要所有列,最好列出你想要的。這樣你就可以添加字段或改變他們的順序,你的程序仍然有效。 – MPelletier 2012-03-01 02:09:56
將它重寫爲連接真的很容易。你會得到什麼結果?它仍然很慢嗎? – 2012-03-01 02:17:16