ENUM数据类型的索引

时间:2017-10-04 13:40:10

标签: mysql

教科书告诉我,不建议对枚举数据类型使用索引。但它并没有告诉我原因。我应该使用ENUM索引吗?本书还告诉我,我们应该在WHERE子句中索引我们使用的列。我总是在我的查询的WHERE部分使用ENUM,它应该根据书籍编入索引。它还说不要索引枚举数据类型。那我该怎么办?

编辑:

我觉得我在问的时候犯了一个错误,我只是再读同一本书而且我觉得我在阅读时遇到了误解,这本书没有明确表示我们不应该使用ENUM的索引,但它说我们不应该对具有非常有限的值范围的列使用索引,例如是/否,0/1等。我从书中抓到的是这些列是ENUM类型的。

3 个答案:

答案 0 :(得分:1)

enum数据类型只是stored as a number(列表中列表项值的位置):

  

您指定为输入值的字符串会自动编码为数字。

因此,enum字段可以像任何其他数字字段一样编入索引。

答案 1 :(得分:0)

我只想与一个枚举索引共享我的个人经验。我有一个非常慢的查询,并且在谷歌搜索时发现了这一点,这让我感到沮丧。但是最终我还是尝试了将索引添加到枚举列中。

我的查询是这样:

SELECT * FROM my_table
WHERE my_enum IN ('a', 'b')
ORDER BY id DESC
LIMIT 0, 100;

id列是主键。我在my_table中有25.000行。 my_enum有4个可能的值。

my_enum上没有索引,查询花费了大约50秒钟来完成。使用索引需要0.015。

这是在12核心Xeon Gold MySQL 8.0服务器上。

答案 2 :(得分:0)

我们之所以不想为具有少量可能值的列建立索引,是因为索引本身的性质。索引的常见数据结构是一个以叶节点为链表的平衡树,仅当值的种类繁多时才支持快速查找。否则,所有冗余值都将存储在链接列表中,这与扫描整个表没有太大区别,有时,如果需要从表中逐行读取行,则速度甚至会更慢。