我刚刚在我的一张桌子上跑了一个"PROCEDURE ANALYZE()".我有这个类型为INT的列,它只包含0到12之间的值(类别ID).MySQL说我会更好用ENUM('0','1','2',......,'12').这个类别基本上是静态的,将来不会改变,但如果他们这样做,我可以改变该列并将其添加到ENUM列表中......
那么为什么ENUM在这种情况下更好?
编辑:我最感兴趣的是这个性能方面......
简而言之,这是因为它以不同的方式编入索引.
在这种情况下,ENUM
说"这是这13个值中的一个",INT
而是说"它可以是任何整数".
这意味着索引更容易,因为它不必考虑您不使用"以防万一"的那些整数的索引.
这与算法有关.
我会感兴趣的是,当它达到一个INT
比它快的时候ENUM
.
在一个中使用数字ENUM
可能有点危险......好像你将这个数字不加引号发送给SQL - 你最终可能会得到错误的值!
哎呀!在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
,您可以随时进行基准测试以查看不同的信息.这篇文章似乎有些相关.