首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql将电子邮件和手机与用户表分开,以避免额外的未使用空间的使用。

mysql将电子邮件和手机与用户表分开,以避免额外的未使用空间的使用。
EN

Database Administration用户
提问于 2020-03-21 19:47:34
回答 1查看 53关注 0票数 0

我有一个问题,如何将一些字符串(固定长度和变量(可能总是为空)放入一个表或将它们分开(因为空间的使用,即使它是空的).

例如,我的用户注册使用手机号码或电子邮件地址。

这是手机号码:

代码语言:javascript
复制
   cellphone_country_code (SMALLINT) (UNSIGNED)
   cellphone_num          (BIGINT)   (UNSIGNED)

这是电子邮件地址:

代码语言:javascript
复制
   email_address         (CHAR(60))

现在哪种选择更好?(我想知道我必须将这些数据从用户表中分离出来)

选项1

代码语言:javascript
复制
user:

     id                      .....
     cellphone_country_code  (SMALLINT) (UNSIGNED)    (Default = 0)
     cellphone_num           (BIGINT)   (UNSIGNED)    (Default = 0)
     email_address           (CHAR(60)) (NULL)        (Default = NULL)

或(选项2)

代码语言:javascript
复制
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空间(基于它的长度,我的意思是)?

EN

回答 1

Database Administration用户

发布于 2020-04-03 03:14:51

使用InnoDB,而不是MyISAM。

只对真正固定长度的列使用CHAR (country_code、uuid、postal_code、md5等)。email不太可能是这样的。

我建议不要对电话号码使用数字字段。如果用户有一个分机怎么办?还是需要领先0?或者进入破折号等等?

您期望有多少用户?一百万就等于1GB以下。与您的多GB服务器中的其他情况相比,即使有10亿用户需要几十个GB,也可能并不重要。

当业务逻辑需要时使用NULL。对于应用程序中的电话和电子邮件,它的意思是“未提供”。这很好。

如果剖析表结构,您会发现超过一半的字节是“开销”是“空闲的”。您尝试的优化相对来说微不足道。

从表中分离列还有其他原因,但我认为您还没有找到有效的列。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/262446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档