2014-05-14 149 views
1

新手在這裏。更多的設計問題。所以我必須選擇以下存儲方法之一以獲得更好的性能(我傾向於多次檢查記錄的類型),同時處理Mysql數據庫中的大數據集。012)記錄(VARCHAR(11)),和值(INT(11))MySQL性能調優

eg: type="one", value= 12 

2)合併列和值

eg: value="one_12" 

哪種做法似乎更加可行之前預先考慮的類型?謝謝你的幫助。

+1

第二種方法違反了[原子性](http://en.wikipedia.org/wiki/First_normal_form#Atomicity)的原理,因此是1NF。 –

回答

3

方法1更好,因爲您需要多次查詢記錄類型。 性能問題與方法2因爲每次你需要做字符串操作,從數據中提取記錄類型然後匹配

4

顯然,第一個變體。第二個殺死了數據結構和關係數據庫的想法。 從閱讀有關數據庫normalization開始。

1

我會推薦第一種方法。據推測,你會將類型存儲在事實表中並將其加入到原始數據中。如果是這樣,那麼代表較大的表存儲一個小的整數值並且(假設你在(value,type)上創建一個索引)連接到事實表將會非常有效和快速地需要更少的存儲空間。

換句話說,我建議像下面

數據表: ID,數據,數據越多,type_value

類型表: type_value,類型

指數類型表使用(type,type_value)上的複合(aka complex aka multicolumn)索引。然後您的加入可以利用覆蓋索引,例如,

SELECT a.* 
FROM data AS A 
INNER JOIN type AS b 
ON a.type_value = b.type_value 
WHERE b.type = ? 

請注意,該命令在MySQL中的複合索引中很重要。因此,如果目標確實要評估WHERE b.type = "One"(例如),您將需要索引(type,type_value),而不是相反。這可以讓你過濾你的類型表並應用索引中的id值,而不需要索引合併。

1

方法1比第二個更好。但是如果你有定義的類型列表,這裏是我的建議。

爲類型(int type_id,varchar類型)創建一個新表並索引類型varchar列。在您的實際表中使用外鍵引用。這將是您的表格變大時處理的理想方式。