哪个更好-将MYSQL中的值存储为数字VS实际值?
答案 0 :(得分:1)
共有三种选择:ENUM
(1-2字节),TINYINT
(1字节),VARCHAR
(1 + n字节)。每种都有优点和缺点。
如果将有数百万行,则VARCHAR
会消耗空间。
如果允许值列表经常更改 ,则ENUM
会遇到需要执行ALTER TABLE
的麻烦。太棒了,如果您遵守这些限制,它也许是最快且干扰最小的ALTER
。
表示的性能3个选择大致相同;不用担心。
我不会将ENUM
的值设置为几十个。太笨拙了,尽管它仍然可以容纳1个字节(最多255个值)。
它们中的任何一个都可以被索引。但是,优化程序很少使用包含“低基数”列的单列索引。 OTOH,一种“复合”索引通常是有益的。
传统上,“男性”和“女性”只是两个值。但是现在您可能需要“拒绝声明”,“未知”和许多其他值。
如果您在谈论“国家/地区代码”,则只需使用CHAR(2) CHARACTER SET ascii
并使用US,ES,AR,NZ,RU等。在这种情况下,CHAR
的清晰度会覆盖其他注意事项。 Y / N是另一个示例,其中CHAR
可能是最好的。
使用ENUM
时,我想以unknown
作为第一个值,并说NOT NULL
。
答案 1 :(得分:0)
数据库整体性能的第一大限制是数据集的大小。您应该计算每个字节。您是在谈论将某物存储在一个位中还是在最坏的情况下将其存储为一个字节,而不是将其存储为4或6字节varchar()。简单的数学运算将显示您添加行时该决策的成本。
对于这些情况,在MySQL中,我将使用CHAR [1]或tinyint。对于“性别”之类的东西,通常有3个互斥选项(“男”,“女”,“未指定”)。无论哪种情况,您的分配成本都是1个字节。
当然,您需要对值进行解码才能表示出来,但是可以使用SQL连接或像这样的小型静态表在应用程序中将其解码为数据库Model类中的常量或GET例程。即使我最终不会在应用程序中使用外键查找表来帮助解决参照完整性约束,我通常也会创建外键查找表,但是如果您不这样做,则不必绝对对所有查找表进行JOINS操作不想。
这种类型的设计是数据库驱动的,完全相关的,并且可以防止应用程序意外引入不良数据。如果使用外键约束正确地设置内容,则应用程序将无法引入不存在的值。使用未经验证的VARCHAR(),不仅浪费了添加的每一行的存储空间,而且还降低了应用程序的弹性。