我有一个问题,如何将一些字符串(固定长度和变量(可能总是为空)放入一个表或将它们分开(因为空间的使用,即使它是空的).
例如,我的用户注册使用手机号码或电子邮件地址。
这是手机号码:
cellphone_country_code (SMALLINT) (UNSIGNED)
cellphone_num (BIGINT) (UNSIGNED)这是电子邮件地址:
email_address (CHAR(60))现在哪种选择更好?(我想知道我必须将这些数据从用户表中分离出来)
user:
id .....
cellphone_country_code (SMALLINT) (UNSIGNED) (Default = 0)
cellphone_num (BIGINT) (UNSIGNED) (Default = 0)
email_address (CHAR(60)) (NULL) (Default = NULL)user:
id .....
....
user_cellphone:
user_id ...... (unique-index)
cellphone_country_code (SMALLINT) (UNSIGNED)
cellphone_num (BIGINT) (UNSIGNED)
user_email:
user_id ...... (unique-index)
email_address (CHAR(60))对于选项1,如果用户使用手机号码注册,并且不想添加电子邮件地址,我们有一个空的未使用的60字节空间用于电子邮件地址(我们不会将它用于该用户!)因此,我认为有一个额外字节的列是不好的,而您不打算使用!但它占用了你的空间!
但在选项2中,没有额外的未使用空间,因为我们在分隔的表中添加了手机号码或电子邮件地址,因此,例如,如果不提供电子邮件地址,就没有任何空的未使用的60字节空间!
我说得对吗?你觉得呢?哪种选择更好?如果我们有一个列(具有固定长度或可变长度的字符串)而我们不使用它,那么它仍然是获取ram空间(基于它的长度,我的意思是)?
发布于 2020-04-03 03:14:51
使用InnoDB,而不是MyISAM。
只对真正固定长度的列使用CHAR (country_code、uuid、postal_code、md5等)。email不太可能是这样的。
我建议不要对电话号码使用数字字段。如果用户有一个分机怎么办?还是需要领先0?或者进入破折号等等?
您期望有多少用户?一百万就等于1GB以下。与您的多GB服务器中的其他情况相比,即使有10亿用户需要几十个GB,也可能并不重要。
当业务逻辑需要时使用NULL。对于应用程序中的电话和电子邮件,它的意思是“未提供”。这很好。
如果剖析表结构,您会发现超过一半的字节是“开销”是“空闲的”。您尝试的优化相对来说微不足道。
从表中分离列还有其他原因,但我认为您还没有找到有效的列。
https://dba.stackexchange.com/questions/262446
复制相似问题