2011-01-08 37 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”]。