2016-12-27 58 views
0

我有一個MySQL表,其中包含20百萬行和2列和像下面的結構。我應該正常化2千萬行×2列MySQL表

item_id (unsigned int[11] PK) | item_name (varchar[50]) | image_path (varchar[50]) 

我應該image_path柱分離到另一個表,像

image_id | image_path 

會有什麼表現收益/損失?請問加入請求比更快請求select *請求這個大型數據集上只有一個表?

我的數據庫現在只有一張桌子。如果我正常化它將是兩個。

,我的要求會像

SELECT items.item_name, images.image_path 
FROM items 
LEFT JOIN images on images.image_id = items.image_id 
WHERE item_id = 123 

和我目前使用

SELECT item_name, image_path FROM items WHERE item_id = 123 

我另一個硬盤選項MySQL分區我與RANGE分區表

性能的最佳方式是什麼?

+1

尊重,除非您向我們展示數據庫設計中的其他表格,否則您的問題沒有任何意義。請[編輯]您的問題,向我們展示您將在潛在'JOIN'操作中使用的表格。 –

+1

您可以爲每件商品有多個圖片嗎?如果不是,那麼創建另一個表就沒有意義了。如果是,那麼你應該創建一個單獨的圖像表。此外,如果您對很多項目使用相同的圖像,那麼您應該再考慮使用單獨的表格。 – Shadow

+0

@Shadow我每個項目只有一個圖像。你能爲你的答案提供一些資源嗎? – hakiko

回答

2

在顯示的查詢中,通過主鍵值123查找items中的一行,然後通過主鍵值連接到images中的一行。這是兩個主鍵值查找,當你可以完成一個。

在MySQL的默認存儲引擎InnoDB中,NULL值不佔用任何存儲空間。所以我會建議如果你的一些項目行有一個image_path,有些不行,那麼只需將image_path定義爲可空。這對於性能肯定會更好。

您還可以問問PARTITION BY RANGE。有鑑於此,2000萬行不是一張大桌子。

在我管理的數據庫中,我按日期對一個表進行了分區,因爲它有4.7 十億個行(即您的表的大小的235倍)。還有不少其他表有數百萬行,但沒有分區就沒問題。

只要您在查找時使用索引或主鍵,您應該沒問題。