Database 在MYSQL中将值存储为数字与实际值,哪个更好?

Database 在MYSQL中将值存储为数字与实际值,哪个更好?,database,Database,在MYSQL中,哪一个更好?将值存储为数字还是实际值?数据库总体性能的最大限制是数据集的大小。你应该计算每个字节。您所说的是将某些内容存储在一个位中,或者在最坏的情况下存储为单个字节,而不是将其存储为4或6字节的varchar()。在添加行时,简单的数学将显示该决策的成本 对于这些情况,在MySQL中,我将使用CHAR[1]或tinyint。对于类似“性别”的东西,通常有3个相互排斥的选项(“男性”、“女性”、“未指定”)。无论哪种情况,您的分配成本都是1字节 当然,出于表示的目的,您需要对值进

在MYSQL中,哪一个更好?将值存储为数字还是实际值?

数据库总体性能的最大限制是数据集的大小。你应该计算每个字节。您所说的是将某些内容存储在一个位中,或者在最坏的情况下存储为单个字节,而不是将其存储为4或6字节的varchar()。在添加行时,简单的数学将显示该决策的成本

对于这些情况,在MySQL中,我将使用CHAR[1]或tinyint。对于类似“性别”的东西,通常有3个相互排斥的选项(“男性”、“女性”、“未指定”)。无论哪种情况,您的分配成本都是1字节

当然,出于表示的目的,您需要对值进行解码,但是您可以使用SQL联接或类似这样的小型静态表,在应用程序中作为常量或在数据库模型类中获取例程来进行解码。我通常会创建外键查找表,即使我没有在应用程序中使用它来帮助处理引用完整性约束,但是如果不想,您不一定要连接到所有的查找表


这种类型的设计是数据库驱动的,完全是关系型的,在防止应用程序意外引入坏数据方面有很大的帮助。如果使用外键约束正确设置,应用程序将无法引入不存在的值。使用未验证的VARCHAR()不仅会为添加的每一行浪费存储空间,而且应用程序的弹性也会降低。

有三种选择:
ENUM
(1-2字节)、
TINYINT
(1字节)、
VARCHAR
(1+n字节)。各有利弊

如果将有数百万行,那么
VARCHAR
将受到空间消耗的影响

如果允许值的列表经常更改,
ENUM
需要执行
ALTER TABLE
。OTOH,如果您遵循这些限制,它可能是最快、干扰最小的
ALTER

3个选项的表现大致相同;别担心

我不会做一个超过几十个值的
ENUM
;这太笨重了,尽管它仍然可以容纳1个字节(最多255个值)

它们中的任何一个都可以被索引。但是,优化器很少使用包含“低基数”列的单列索引。“综合”指数通常是有益的

传统上,“男性”和“女性”只是两种价值观。但现在您可能需要“拒绝声明”、“未知”和大量其他值

如果您谈论的是“国家/地区代码”,那么只需使用
CHAR(2)字符集ascii
,并使用US、ES、AR、NZ、RU等。在这种情况下,
CHAR
的清晰性将压倒其他注意事项。Y/N是另一个示例,
CHAR
可能是最好的


当使用
ENUM
时,我喜欢从
unknown
作为第一个值开始,并说
notnull

第一个限制是缺少索引。@缺少索引不是限制,它是开发人员理解查询性能所需内容的一种选择或不足。由于您确实提出了这个问题,当创建索引时,同样的错误可能会被放大,因为这些varchar最终会在索引中使用更多的空间/内存。也就是说,性别是很低的基数值,通常你不想用btree索引自己索引。谢谢。有道理,谢谢。有道理。@FKM-关于这个话题有很多问答,有些人的意见比我的强。你在正确的时间发表了评论,因为我需要一些专家建议。。当用户将位置添加到他们的个人资料时,我从Google Places自动完成获取城市信息。我想将城市存储在我的数据库中,但我必须使用VARCHAR,因为我没有所有城市的索引列表。这样行吗?一个资料显示世界上有300多万个城市。这不能用
ENUM
完成
VARCHAR
有意义。如果您为每个用户存储城市,我只需使用
VARCHAR