2012-07-12 113 views
1

我使用JOIN和MySQL一起選擇一篇文章以及與它相關的所有評論,但是我意識到當我選擇一篇文章並且有多條評論時,我會得到與評論數量相同的文章。例如:
我有表articles有以下的列:
1. id
2. article
和工作臺comments有以下的列:
1. c_id
2. body
3。 a_idJOIN返回重複結果,我應該擔心這一點嗎?

MySQL查詢我試過用:

SELECT * FROM `articles` 
JOIN`comments` 
ON (`articles`.id = `comments`.a_id) 
WHERE `articles`.id = 134 

這是最終的結果:

id article c_id body  a_id 
134 Article1 2 Comment1 134 
134 Article1 3 Comment2 134 
134 Article1 8 Comment3 134 

所以我的問題是:由於我得到同樣的article列的值對每一個評論, 這是否會減慢MySQL查詢或通過反正我的web應用程序?因爲我要求更多的數據,所以我真的需要。
我可以將查詢分開爲2個簡單的SELECT查詢,但這樣做會過度,對嗎?

感謝您的閱讀。

編輯:
,如果我article列的值是什麼更大,一些含有1K +字符,將使其自複製呢?

+0

您可能想要考慮進入的負載總量 - 您可能正試圖優化速度已經足夠快的事情。這似乎就是這種情況。 – 2012-07-13 15:30:32

回答

3

因爲我得到了相同的文章列的值每一個評論, 這是否會減慢MySQL查詢或通過反正我的web應用程序?因爲 我要求更多的數據,然後我真的需要。

由於數據庫正在傳輸比需要的更多的字節,因此存在與此相關的性能成本,但它可能不明顯。

我可以將查詢分隔爲2個簡單的SELECT查詢,但這會過度殺毒吧?

很難說沒有測量。如果文章的價值是千兆字節而不是幾個字符,那麼你可能會想做兩個選擇而不是一個。

+0

如果我的文章欄的值更大,那麼包含1k +個字符的內容會如何複製? – Abdulaziz 2012-07-12 17:39:57

+0

我可能會在這種情況下做兩個查詢,但這是我的偏見。如果您想嚴格確定它的重要性,您可以測試以查看實際差異。 – 2012-07-12 17:59:13

2

您可以在一個查詢中獲得想要顯示的所有文章,然後對所有評論WHERE comments.a_id IN (1,2,5,6,9,10)執行另一次mysql調用,然後在您的應用程序中爲您顯示的文章提供相關評論。

我認爲這比在每篇文章的單獨查詢中獲得評論更有效。

+0

真正的高負荷目標解決方案。我喜歡。 – 2012-07-12 17:20:49

+0

我可能會誤解你的答案,但我認爲將聯合轉換爲單獨的數據庫調用每個表通常不是很好的建議(除非也許你的ORM是這樣做的,然後優化通常是強制聯接)。 – 2012-07-12 17:24:37

+0

+1,但我不願意在任何頁面顯示多個文章,所以它不適用於我的Web應用程序。 – Abdulaziz 2012-07-12 17:25:08

1

這沒關係。拆分爲兩個查詢需要兩次到數據庫,執行相似的查詢兩次等。在大多數設置中,獲取更多數據比較昂貴 - 希望客戶端與數據庫通信所使用的協議可以優化這一點。 MySQL有一個選項use compression between client and server - 這應該優化傳輸的數據。

如果這對於您的應用程序至關重要,則應該進行基準測試並選擇最適合您的應用程序。

如果不是採用易於實現的方法 - 對整個應用程序進行性能/負載測試,找出瓶頸並修復這些瓶頸。

1

通常選擇比您需要的更多的信息會更好,而不必回過頭去從另一個查詢中獲取更多數據庫。

在這種情況下,我無法想象你也會通過抓取article記錄太多來減慢系統速度。如果你擔心它,不要使用select *而是明確要求列像這樣:

SELECT `comments`.c_id , `comments`.body, `comments`.a_id 
FROM `articles` 
    JOIN `comments` ON `articles`.id = `comments`.a_id 
WHERE `articles`.id = 134 
+0

其實,這就是我現在正在做的,我只是用'SELECT *'來解決這個問題。 – Abdulaziz 2012-07-12 17:26:24

+0

我明白了。那麼,所有與性能有關的東西,你都必須測試。 – 2012-07-12 17:45:37

1

,如果您單獨執行兩個查詢,肯定是要慢。 如果在執行查詢之前有「article.id」,則不需要使用JOIN。

相關問題