2012-05-19 85 views
0

我今天看了這篇關於連接性能的博文http://www.andrewrollins.com/2009/06/21/mysql-join-performance/。正如所見,加入可能會以某種方式降低性能。Mysql連接vs有重複

現在我們來看一個兩個表user_profile和user_gallery的例子。

user_profile 
user_id | avatar | nickname | ... 

user_gallery 
image_id | user_id | image | caption | is_avatar 

在頁面瀏覽的用戶,列出用戶與他們的暱稱和頭像圖片。

我可以得到圖像中的用戶列表與加盟

INNER JOIN user_gallery ON user_gallery.user_id=user_profile.user_id WHERE user_gallery.is_avatar=1 

或者我可以投入化身場成像路徑。在這種情況下,我不需要使用is_avatar字段,並且我擁有顯示錶user_profile中的用戶所需的全部數據。所以不需要額外的連接。但由於頭像圖片是用戶圖庫的一部分,這意味着值爲頭像也在user_gallery表中,因此有一個重複值。

真的值得嚴格遵循可能降低性能的規範化規則,考慮到這種情況嗎?在這種情況下會更好嗎?

+0

我不明白,爲加盟者'user_profile'的需要,如果你不需要從它的列。否則,我不會看到user_profile.avatar字段在給定用戶配置文件可能有多個圖像時如何工作... –

+0

一個用戶只能在用戶列表頁面(瀏覽用戶)中顯示1個頭像和頭像圖像。在瀏覽用戶中,它是具有暱稱,年齡和頭像圖片的用戶列表。在瀏覽用戶頁面上,頭像鏈接到用戶個人資料。我不確定你的意思是不需要列。我需要瀏覽用戶關於暱稱,年齡和頭像的頁面數據。 當您在用戶個人資料頁面上時,您還可以看到用戶圖庫。用戶註冊時,頭像圖像也自動成爲用戶圖庫的一部分。 – JohnyFree

回答

1

合乎邏輯的選擇對我來說似乎放棄is_avatar場,只是有user_profile.avatar參考的image_id ...

+0

這是基於理智的規範化原則,在我看來,這應該始終是首要問題,直到您知道性能是一個問題。在這種情況下,它不應該是高成本的,因爲您只會對其主鍵索引的user_gallery記錄進行額外讀取。 –

+0

我需要記住,稍後我可能會決定也顯示城市,這將是額外的連接,因爲城市名稱在另一個表中。 – JohnyFree

+0

我已經在user_account表中使用了另一個連接,因爲我只需要顯示具有is_active字段值爲1的用戶。所以這就是爲什麼我要儘可能限制連接的原因。 – JohnyFree