【问题标题】:MySQL Enum performance advantage?MySQL Enum 性能优势?
【发布时间】:2010-10-20 11:02:13
【问题描述】:

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

【问题讨论】:

    标签: mysql enums


    【解决方案1】:

    ENUM 用于以下操作会带来巨大的性能惩罚

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

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

    我不是 MySQL 的ENUM 的粉丝。我更喜欢使用查找表。另请参阅我对“How to handle enumerations without enum fields in a database?”的回答

    【讨论】:

    • 我的枚举值将是人口统计 (W,B,A,H,O,U) 性别(M,F,U) 和派对(R,D,I,U) 之类的东西从不改变。所以它们总是可以硬编码到我的应用程序逻辑中。因此,查询下拉值和更改结构并不是什么大问题。
    • “我的枚举值......永远不会改变”。 很想获得一些关于该陈述被证明错误的次数的统计数据。
    • 虽然列出的要点是正确的,但 ENUM 仍然比 JOINS 快,尤其是当您按该列排序时。对于设置值不变的性别等列,我更喜欢使用 ENUM。如果您需要添加或删除值的可能性很小,请使用 JOIN 或使用 CHAR/VARCHAR/TINYINT 并在应用程序级别管理它们。另一件事...... MySQL 不会在列中存储实际值,仅存储索引(INT),因此您不妨使用全文字符串显示给您的用户(即 Male 而不是 M)并保存额外的编码。 ;-)
    • @Jabari,是的,但是您可以使用外键到查找表中的自然键(即没有自动增量),然后您不需要进行连接。
    • @Bill 非常正确,但是如果您有一些永远不会改变的价值观,为什么要这样做呢?我喜欢让我的数据库和查询尽可能精简。创建一个全新的表格来容纳“男性”、“女性”和“未知”是不整洁的(因为没有更好的词)。如果它提高了性能或者值可能在某个时候发生变化,那么一定要创建另一个表!否则就是臃肿。
    【解决方案2】:

    ENUM 在内部由 1 或 2 个字节表示,具体取决于值的数量。如果您存储的字符串大于 2 个字节并且很少更改,那么 ENUM 就是要走的路。使用枚举进行比较会更快,并且它们占用的磁盘空间更少,这反过来会导致更快的寻道时间。

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

    【讨论】:

    • 我不确定您指的是哪个版本的 MySQL。但是从 5.0 开始,枚举类型的大小是 1 字节还是 2 字节取决于手册中可能值的数量:dev.mysql.com/doc/refman/5.0/en/storage-requirements.html 由于可能值只有 5 到 10 个,因此大小应该是 1 字节
    • @Lacek 你是对的!我会将答案从 16 位更改为 1 或 2 个字节
    【解决方案3】:

    在这篇文章中Using the ENUM data type to increase performanceFernando 研究了 Enum 类型的查询性能。

    结果是,虽然从设计的角度来看,使用 ENUM 可能看起来不那么优雅(如果您的 ENUM 值有时会发生变化),但对于大型数据集而言,性能提升是显而易见的。

    嗯,很明显,从设计的角度来看,使用 ENUM 可能看起来不那么优雅(如果我在不止一个表中使用类型会发生什么?如果我想添加一个类型怎么办?我必须改变表格!),性能优势,如果我要处理大量数据(我的测试是少量的,但我没有服务器,只是一个非常简陋的笔记本)可能是值得的.

    详情请参阅他的文章。你同意吗?

    【讨论】:

      【解决方案4】:

      不,看比较here

      优势在于代码可读性。

      【讨论】:

      • 根据您链接的文章,只要您不更改可能的状态,使用 ENUM 就有性能优势。
      猜你喜欢
      • 2011-03-21
      • 2015-01-06
      • 2010-10-12
      • 2011-12-18
      • 1970-01-01
      • 2014-11-30
      • 2012-07-13
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多