为什么ENUM比INT更好
我只是在其中一张表上运行了" 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"触发器来检查值。
如果我们担心ENUM
和TINYINT
之间的性能差异,可以随时进行基准测试以查看差异。这篇文章似乎有些相关。