为什么ENUM比INT更好

时间:2020-03-06 14:31:39  来源:igfitidea点击:

我只是在其中一张表上运行了" PROCEDURE ANALYZE()"。我有此列的类型为INT,它只包含0到12(类别ID)之间的值。
MySQL表示我最好使用ENUM('0','1','2',...,'12')。该类别基本上是静态的,将来不会更改,但是如果这样做,我可以更改该列并将其添加到ENUM列表中。

那么为什么在这种情况下ENUM更好呢?

编辑:我主要对此性能方面感兴趣...

解决方案

因为它对可能的值引入了约束。

我不是MySQL专家,但是我的猜测是整数总是占用四个字节的空间,其中枚举根据所需数据的范围占用不同的空间量。由于我们只需要13个项目,因此可以为列使用1个字节来避免浪费。

简而言之,这是因为它以不同的方式编制了索引。

在这种情况下,ENUM表示"它是这13个值中的一个",而INT表示"它可以是任何整数"。

这意味着建立索引更加容易,因为不必将那些我们不使用的整数的索引考虑在内,以防万一。

这与算法有关。

我会很感兴趣,尽管当它到达某个点时,INT会比ENUM更快。

但是,在ENUM中使用数字可能会有些危险……好像我们将此数字发送给SQL时一样,可能最终会返回错误的值!

在Oracle上,我将拥有一个BITMAP索引,该索引比对如此少的值进行基于哈希的查找要快得多。 (因此,我认为MySQL在查询优化或者索引编制方面具有类似的优势。)

有趣的是,MySQL文档建议对ENUM类型使用"看起来像数字的东西"是错误的选择,因为枚举值和枚举索引之间可能存在混淆(http://dev.mysql.com/doc/refman/5.0 /en/enum.html)。

kes!在" ENUM"字段中使用数字存在很多歧义。当心。我记得的一个陷阱是,我们可以按索引访问ENUMS中的值:如果枚举是ENUM('A','B','C','1','2,'3'),那么这两个查询是非常不同的:

INSERT INTO TABLE (example_col) VALUES( '1' ); -- example_col == 1
INSERT INTO TABLE (example_col) VALUES(  1  ); -- example_col == A

我假设建议是因为它限制了可以进入表的有效值。例如,插入13应该是默认选择。

一个更好的选择是使用" TINYINT"而不是" INT"。 " UNSIGNED TINYINT"的范围是0到255,并且只需要1个字节即可存储。一个" INT"需要4个字节来存储。如果要限制进入表的值,可以添加" ON INSERT"和" ON UPDATE"触发器来检查值。

如果我们担心ENUMTINYINT之间的性能差异,可以随时进行基准测试以查看差异。这篇文章似乎有些相关。