MySQL Enum的性能优势?

gsu*_*008 50 mysql enums

在字段中只有5-10个不同的可能值的情况下使用枚举是否有性能优势?如果没有什么优势?

Bil*_*win 45

使用以下操作会产生巨大的性能损失ENUM:

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

  • 更改允许值集.它需要一个ALTER TABLE语句,它可以锁定表并可以进行重组.

我不是MySQL的粉丝ENUM.我更喜欢使用查找表.另请参阅我的回答" 如何处理数据库中没有枚举字段的枚举? "

  • "我的枚举价值......永远不会改变".**会爱**以获得有关该陈述被证明错误的次数的一些统计数据. (38认同)
  • 我的枚举值将是人口统计(W,B,A,H,O,U)性别(M,F,U)和Party(R,D,I,U)这些永远不会改变的东西.所以它们总是可以硬编码到我的应用程序逻辑中.因此,查询下拉值并改变结构并不是一个很重要的因素. (4认同)
  • 虽然列出的要点是正确的,但ENUM仍然比JOINS快,特别是如果您按该列排序.对于性别等设置值不变的列,我更喜欢使用ENUM.如果甚至存在远程可能需要添加或删除值的情况,请使用JOIN或使用CHAR/VARCHAR/TINYINT并在应用程序级别管理它们.另一件事...... MySQL不会在列中存储实际值,只存储索引(INT),因此您也可以使用全文本字符串显示给您的用户(即男性而不是M)并保存额外的编码.;-) (2认同)
  • @Bill非常正确,但如果你有一些永远不会改变的价值观,为什么呢?我喜欢尽可能地保持我的数据库和查询.创建一个全新的表来保存"男性","女性"和"未知"是不整洁的(因为没有更好的词).如果它提高了性能或者值可能会在某个时刻发生变化,那么一定要创建另一个表!否则它只是臃肿. (2认同)

Joh*_*hat 24

ENUM在内部由1或2个字节表示,具体取决于值的数量.如果您存储的字符串大于2个字节并且很少更改,则可以使用ENUM.使用枚举进行比较会更快,并且它们在磁盘上占用更少的空间,这反过来可以导致更快的搜索时间.

缺点是,在添加/删除值时,枚举的灵活性较低.


Gui*_*dre 11

在本文中,http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ Fernando研究Enum类型的查询性能.

结果是,从设计的角度来看,使用ENUM可能看起来不那么优雅(如果您的ENUM值有时会发生变化),对于大型数据集,性能增益是显而易见的.请参阅他的文章了解详情.你同意吗?