MySQL 枚举类型的性能优势?

61

在仅有 5-10 种可能值的字段情况下,使用枚举是否具有性能优势?如果没有,那么它的优点是什么?

4个回答

58

使用ENUM进行操作时存在巨大的性能惩罚,如:

  • 查询ENUM中允许值的列表,例如填充下拉菜单。 您必须从INFORMATION_SCHEMA查询数据类型,并从返回的BLOB字段中解析列表。

  • 更改允许的值集。 它需要一个ALTER TABLE语句,这将锁定表并可能进行重构。

我不喜欢MySQL的ENUM。 我更喜欢使用查找表。 另请参阅我的答案:“如何处理数据库中没有枚举字段的枚举?


5
我的枚举值将会是人口统计资料(W,B,A,H,O,U),性别(M,F,U)和政党(R,D,I,U)。这些值永远不会改变,因此可以始终硬编码到我的应用逻辑中。所以查询下拉列表的值和更改结构并不是很重要的因素。 - gsueagle2008
62
我会尽力进行翻译并简化原文,确保意思不变。请问需要翻译的内容是:"my enum values ... would never change". Would love to get some stats on how many times that statement has been proved wrong. - benmarks
3
虽然列出的要点是正确的,但ENUM比JOINS仍然更快,尤其是如果你按该列排序。 对于像性别这样具有不变设置值的列,我更喜欢使用ENUM。 但是,如果甚至有可能需要添加或删除值,请选择JOIN或使用CHAR / VARCHAR / TINYINT在应用程序级别进行管理。 还有一件事... MySQL不会在列中存储实际值,只会存储索引(INT),因此您最好使用完整文本字符串来显示给用户(例如Male而不是M),以节省额外的编码。;-) - Jabari
5
非常正确,但如果您有一些永远不会更改的值,为什么要这样做呢?我喜欢让我的数据库和查询保持尽可能简洁。创建一个全新的表来保存“男性”,“女性”和“未知”很不整洁(用词不当)。如果它可以提高性能或这些值可能在某个时候发生变化,那么请务必创建另一个表格!否则就是臃肿。 - Jabari
1
@Bill - 我知道这是一个晚回复!为什么你要查询类似男/女/未知之类的东西?正如我上面所说,这只应在您确信(我指100%确定)值已设置且永远不会更改的情况下使用。因此,查询您已知的内容将是糟糕的编程。此外,这不仅仅是为了美观。这种方式的性能比连接好得多。性能是可衡量的,因此它远非意见...无论是审美还是其他方面。 - Jabari
显示剩余3条评论

29

ENUMs 内部使用 1 或 2 字节表示,取决于值的数量。如果你存储的字符串大于 2 字节且很少更改,则 ENUM 是一个好选择。与字符串比较相比,枚举比较更快,并且它们在磁盘上占用更少的空间,这反过来可以导致更快的查找时间。

缺点是枚举在添加/删除值时不太灵活。


我不确定您所指的MySQL版本是哪个。但是自从5.0版本以来,根据手册(http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html),枚举类型的大小取决于可能值的数量,可以是1或2个字节。由于只有5到10个可能的值,因此大小应为1个字节。 - Lacek
@Lacek 你是正确的!我会把答案从16位改为1或2个字节。 - John Douthat

13
在这篇文章《使用ENUM数据类型提高性能》中,Fernando探讨了在查询中使用Enum类型的性能问题。
结果是,虽然从设计角度来看,如果您的ENUM值有时会发生更改,使用ENUM可能似乎不太优雅(What if I want to add a type? I have to alter the table!),但对于大型数据集,性能提升是显而易见的。
引用他的话:“嗯,很明显,虽然从设计角度来看,使用ENUM可能似乎不太优雅(如果我在多个表中使用类型会发生什么?如果我想添加类型怎么办?我必须修改表!),但如果我要处理大量数据(我的测试只涉及少量数据,但我没有服务器,只有一台非常简陋的笔记本电脑),那么性能好处可能是值得的。”
详情请参阅他的文章。你同意吗?

1

不,可以在这里比较一下。

优势在于代码的可读性。


11
根据您提供的文章,只要不更改可能的状态,使用ENUM确实具有性能优势。 - Dmitri Farkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接