首页 > 解决方案 > 将 ENUM 中定义的值在 MariaDB 中排序是否有任何性能优势?

问题描述

我认为标题是不言自明的。假设我们有这张表:

CREATE TABLE tickets (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    priority ENUM('c', 'a', 'b') NOT NULL
);

如果我对优先级 ENUM 中的值进行排序,它会获得任何性能吗?像这样:

priority ENUM('a', 'b', 'c') NOT NULL

标签: mysqlsqlmariadb

解决方案


枚举按它们的索引号排序,而不是它们的值:

ENUM 值根据它们的索引号进行排序,这取决于枚举成员在列规范中列出的顺序。例如,对于 ENUM('b', 'a'),'b' 排在 'a' 之前。空字符串排在非空字符串之前,NULL 值排在所有其他枚举值之前。

所以实际的元素值对性能没有影响,因为 MySQL 在处理枚举时只处理数字(包括对它们进行排序):

您指定为输入值的字符串会自动编码为数字。有关 ENUM 类型的存储要求,请参见第 11.7 节,“数据类型存储要求”。

虽然没有性能优势,但以正确排序的顺序指定元素(不一定必须按字典顺序)具有order by enum_column可能不会给您带来意外结果的好处。


推荐阅读