快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

面试官:讲讲mysql表设计要注意啥

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

最近在回顾mysql的内容,我有一些经验。我随便谈论的部分知识是Yan Ge自己的一些作品的总结和经验。阅读后,您实际上可以避免很多凹坑。面试过程中实际上会问很多问题!

例如

好,特别是以下问题

  • 1.为什么必须设置主键?
  • 2.您的主键使用自动增量还是UUID?
  • 3.为什么不建议主键具有商业意义?
  • 4.为什么枚举类型不代表枚举字段?
  • 5.使用哪种类型的货币字段?
  • 6.使用哪种类型的时间字段?
  • 7.为什么不直接存储大容量内容,例如图片,音频和视频?
  • 8.为什么应将字段定义为NOT NULL?

实际上,对于上述问题,我最早想到的是每个问题都可以详细列出一篇文章。后来,由于他的良知,严决定使用一篇文章来解释所有这些问题。

当然,我给出的答案可能不是标准答案,毕竟,这是我的一些工作的总结。读者有更好的答案,也欢迎交流!

在这里我不得不说,我仅将存储引擎与mysql一起使用,而其他引擎则从未使用过。因此,我的答案基于存储引擎。

问题1:为什么必须设置主键?

答案:因为您没有设置主键,所以innodb还将帮助您生成隐藏列作为自动递增的主键。因此,无论如何,您必须生成一个主键,然后您也可以自己指定一个主键,在某些情况下,可以显式使用主键索引,从而提高查询效率!

问题2:主键是递增的还是UUID?

答案:答案肯定会增加。 innodb中的主键是聚集索引。如果主键是自增量的,则每次插入新记录时,该记录将按顺序添加到当前索引节点的后续位置。页面满时,将自动打开一个新页面。如果它不是自动递增的主键,则可能会将其插入中间,这将导致页面拆分并产生很多表碎片! 。

上面的句子是无法理解的,没关系,白话是:使用自我增加的插入效果是不错的!

此外,还附有一张测试台。具有uuid的表名称是将uuid用作主键。如果您看一下它,就会发现性能差距:

如上图所示,当主键为UUID时,插入时间会更长,并且会占用更多空间!

啊,别忘了,当您回答自动增量主键时,请考虑一下”自动增量主键用完后应该怎么办?” 》

:这个问题,如果您可以证明合理的理由。

问题3:为什么不建议主键具有商业意义?

答案:有以下两个原因

  • (1)因为具有业务含义的任何列都有可能更改,所以一旦主键具有业务含义,则主键可能会更改。一旦主键更改,磁盘上数据的存储位置将更改,这可能会导致页面拆分和空间碎片。
  • (2)具有业务含义的主键不一定按顺序增加。这将导致数据插入的顺序,并且不能保证插入数据的主键必须大于先前的数据。如果发生这种情况,则后面插入的数据的主键小于上一个的主键,这可能会导致页面拆分和空间碎片。

问题4:为什么不将枚举字段用于枚举字段?

答案:代表作品中的枚举字段,通常使用该类型。

那么为什么不使用枚举类型呢?以下两个原因

(1)ENUM类型的ORDER BY操作效率低下,需要其他操作

(2)如果枚举值是数字值,则存在陷阱

例如,表结构如下

 

此时,您执行语句

 

查询结果是

父亲的结果。

insert语句应编写如下,插入的是1

 

问题5:使用哪种类型的货币字段?

答案:如果货币单位是美分,则可以使用该类型。如果您坚持使用人民币,请使用它。

不要回答,因为float和double是存储在二进制文件中的,所以存在一定的错误。

例如,您按如下方式构建一列

 

然后在价格列中插入数据,您将发现显示的数据变得不正确!

问题6:什么类型的时间字段?

答案:这个问题没有固定答案,您应该结合您的项目背景来回答!请说明原因!

(1)如果使用varchar类型存储时间,则优点是显示直观。但是也有很多坑。例如,如果未验证插入的数据,则可能会找到某天的一条数据。这是2013年1月11日还是2013年11月1日?

其次,要进行时间比较操作,您需要使用wait函数将其转换为时间类型。您会发现不可能达到索引。大量数据是一个坑!

(2),此类型是一个四字节整数,它可以表示从1970-01-01 08:00:01到2038-01-19 11:14:07的时间范围。 2038年之后,无法按类型存储时间。

但是它有一个优势,类型是带有时区信息。例如,一旦系统中的时区发生更改,就可以更改时区

 

您将发现项目中此字段的值将自行更改。此功能用于执行一些大型的国际项目,尤其是在跨时区应用时!

(3),日期时间存储区占用8个字节,并且其存储的时间范围是1000-01-01 00:00:009999-12-31 23:59:59。显然,存储时间范围更大。但是它的缺点是它存储没有时区信息的时间的绝对值。如果您更改数据库的时区,则此项的值本身不会更改!

(4)也是8个字节,它本身会维护一个时间戳,这意味着范围比大多数都大。必须自己维护它,这很不方便。

问题7:为什么不直接存储大量内容,如图片,音频和视频?

答案:在实际应用中,我们习惯于存储文件。然后在mysql中,仅保存文件存储路径。 mysql中有两种用于存储大容量文件的字段类型,即和类型。但是,我们基本上不会在生产中使用这两种类型!

主要原因如下

  • (1)Mysql内存临时表不支持大数据类型,例如TEXT和BLOB。如果查询中包含此类数据,则在排序和其他操作期间无法使用内存临时表,而必须使用磁盘临时表执行。导致查询效率降低
  • (2)内容过多。由于您的数据内容相对较大,因此将导致更多的内容。每个人都知道主从同步是基于同步的。如果太大,将导致主从同步效率问题!

因此,不建议使用和键入!

问题8:为什么应将字段定义为NOT NULL?

答案:好的,从两个角度回答了这个问题。

(1)索引表现不佳

Mysql难以优化引用可空列的查询,这使索引,索引统计信息和值更加复杂。可空列需要更多的存储空间和mysql内部的特殊处理。在为可为空的列建立索引之后,每个记录都需要一个额外的字节,这也可能导致MYisam中的固定大小索引变为可变大小索引。

-摘自《高性能MySQL第二版》

(2)查询将显示一些不可预测的结果

这是一个例子,每个人都会理解。假设表结构如下

 

表数据是这样

<表格>

id

名称

<身体>

1

寂寞的烟气

3

5

费超

7

您执行语句

 

您会发现结果为2,但实际上有四段数据!实际上有很多类似的查询问题,没有一一列出。

请记住,由于存在null列,将会有许多意外的结果,从而浪费了开发时间来排查该错误。

希望大家都能有所收获!

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638