2011-01-08 35 views
0

我目前在MySQL數據庫中使用枚舉作爲TINYINTs。我的桌子上有幾百萬行。然後,我們將TINYINT的枚舉映射到其他地方的Strings。在MySQL中使用字符串枚舉 - 性能問題

我正在考慮將這些枚舉存儲爲字符串。如果字符串索引正確,是否有人知道MySQL在查詢String枚舉而不是TINYINT枚舉時如何執行?

欣賞幫助。謝謝。

+0

燦你澄清,如果你正在使用MySQL的ENUM(http://dev.mysql.com/doc/refman/5.0/en/enum.html)數據類型或不? – Nishant 2011-01-08 21:31:44

回答

0

TINYINT(或INTEGER爲此目的)索引速度更快,並且在SORT或SELECT中的性能比VARCHARCHAR更好。

因此,要回答你,是的字符串被正確索引,但性能可能會下降。我無法分辨這會有多重要。


編輯1更多信息

好像小VARCHARINTEGER在索引可以忽略不計的性能差異。看到這裏http://forums.mysql.com/read.php?115,251611,252006#msg-252006

1

(假設你正在使用TINYINT,有一個查找表)TINYINT比較快,但是你最終可能會看到一些性能影響,因爲加入。

我的建議是,如果你的枚舉值慣於變化(例如 - 男,女類型,是沒有類型的枚舉),使用MySQL ENUM領域代替。它使用1個字節存儲(如果枚舉值小於255),並且不需要連接。

但要注意,並採取暴跌之前讀了ENUM數據類型的所有利弊。

3

枚舉被存儲爲,如果有一個查找表,因此,只有一個數值參考存儲在每一行中,以查找表的其他地方。從技術上講,匹配一個枚舉的整數值與匹配一個整數一樣快,因爲匹配一個整數是一樣的,匹配一個字符串值的速度稍微慢一些(在所有情況下,第一列),因爲只有一個「搜索」完成查找表查找整數值,然後用它來執行查找。

這一個實例是如果您搜索不存在的值,請嘗試將enum的數值與不存在的值進行匹配,並且它仍將搜索所有數據,但會嘗試匹配字符串值不存在,並且通過查找表執行較小的搜索,在搜索任何數據之前不返回匹配。

不要使用枚舉的「是/否」或「男/女」的答案,作爲數值數據和查找表佔用遠遠更多的空間比一「位」的值(0或1)。另外,不要在枚舉定義中使用數字字符串,例如枚舉(「1」,「0」),因爲這是對任何人看代碼以及查詢(混淆,因爲所存儲的查找表是[0 =>「1」,1 =>「0」]。