面试官:MySQL表设计要注意什么?
这篇文章的很多问题,都是面试中实打实会问到的!
比如
OK,具体有下面这些问题
其实上面这些问题,我最早想法是,每个问题都可以啰嗦出一篇文章。后来由于良心发现,烟哥就决定用一
引言 这篇文章的很多问题,都是面试中实打实会问到的! 比如 OK,具体有下面这些问题 其实上面这些问题,我最早想法是,每个问题都可以啰嗦出一篇文章。后来由于良心发现,烟哥就决定用一篇文章将这些问题都讲明白。 当然,我给的回答可能并非标准答案,毕竟是自己的一些工作总结。各位读者有更好的回答,也欢迎交流! 这里我要说一下,我用mysql只用过innodb存储引擎,其他的引擎真没用过。因此我的回答,都是基于innodb存储引擎中的。 正文 问题1:为什么一定要设一个主键? 回答:因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。所以啦,反正都要生成一个主键,那你还不如自己指定一个主键mysql数据表,在有些情况下,就能显式的用上主键索引,提高查询效率! 问题2:主键是用自增还是UUID? 回答:肯定答自增啊。innodb 中的主键是聚簇索引。如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片!。 上面那句话看不懂没事,大白话一句就是:用自增插入性能好! 另外,附一个测试表给你们,表名带uuid的就是用uuid作为主键。大家看一下就知道性能差距了: 如上图所示,当主键是UUID的时候,插入时间更长,而且占用空间更大! 额,大家千万不要忘了,当你回答自增主键后,想一下 ps:这个问题,你要是能把UUID讲出合理的理由也行。 问题3:主键为什么不推荐有业务含义? 回答:有如下两个原因 问题4:表示枚举的字段为什么不用enum类型? 回答:在工作中表示枚举的字段,一般用tinyint类型。 那为什么不用enum类型呢?下面两个原因 (1)ENUM类型的ORDER BY操作效率低,需要额外操作 (2)如果枚举值是数值,有陷阱 举个例子,表结构如下
此时,你执行语句
查询出的结果为 foobar 0 就产生了一个坑爹的结果。 插入语句应该像下面这么写,插入的才是1
问题5:货币字段用什么类型? 回答:如果货币单位是分,可以用Int类型。如果坚持用元,用Decimal。 千万不要答float和double,因为float和double是以二进制存储的,所以有一定的误差。 打个比方,你建一个列如下
然后insert给price列一个数据为1234567.23,你会发现显示出来的数据变为1234567.25,精度失准! 问题6:时间字段用什么类型? 回答:此题无固定答案,应结合自己项目背景来答!把理由讲清楚就行! (1)varchar,如果用varchar类型来存时间,优点在于显示直观。但是坑的地方也是挺多的。比如,插入的数据没有校验,你可能某天就发现一条数据为2013111的数据,请问这是代表2013年1月11日,还是2013年11月1日? 其次,做时间比较运算,你需要用STR_TO_DATE等函数将其转化为时间类型,你会发现这么写是无法命中索引的。数据量一大,是个坑! (编辑:徐州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |