教科书告诉我,不建议对枚举数据类型使用索引。但它并没有告诉我原因。我应该使用ENUM索引吗?本书还告诉我,我们应该在WHERE子句中索引我们使用的列。我总是在我的查询的WHERE部分使用ENUM,它应该根据书籍编入索引。它还说不要索引枚举数据类型。那我该怎么办?
编辑:
我觉得我在问的时候犯了一个错误,我只是再读同一本书而且我觉得我在阅读时遇到了误解,这本书没有明确表示我们不应该使用ENUM的索引,但它说我们不应该对具有非常有限的值范围的列使用索引,例如是/否,0/1等。我从书中抓到的是这些列是ENUM类型的。
答案 0 :(得分:1)
答案 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)
我们之所以不想为具有少量可能值的列建立索引,是因为索引本身的性质。索引的常见数据结构是一个以叶节点为链表的平衡树,仅当值的种类繁多时才支持快速查找。否则,所有冗余值都将存储在链接列表中,这与扫描整个表没有太大区别,有时,如果需要从表中逐行读取行,则速度甚至会更慢。