引言

这篇文章的很多问题,都是面试中实打实会问到的!

比如

mysql时间戳_qq的戳一戳_是吃鸡要吃老母鸡,戳b要戳排骨b

OK,具体有下面这些问题

其实上面这些问题,我最早想法是,每个问题都可以啰嗦出一篇文章。后来由于良心发现,烟哥就决定用一篇文章将这些问题都讲明白。

当然,我给的回答可能并非标准答案,毕竟是自己的一些工作总结。各位读者有更好的回答,也欢迎交流!

这里我要说一下,我用mysql只用过innodb存储引擎,其他的引擎真没用过。因此我的回答,都是基于innodb存储引擎中的。

正文

mysql时间戳_是吃鸡要吃老母鸡,戳b要戳排骨b_qq的戳一戳

问题1:为什么一定要设一个主键?

回答:因为你不设主键的情况下mysql时间戳,innodb也会帮你生成一个隐藏列,作为自增主键。所以啦,反正都要生成一个主键,那你还不如自己指定一个主键,在有些情况下,就能显式的用上主键索引mysql时间戳,提高查询效率!

问题2:主键是用自增还是UUID?

回答:肯定答自增啊。innodb 中的主键是聚簇索引。如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片!。

上面那句话看不懂没事,大白话一句就是:用自增插入性能好!

另外,附一个测试表给你们,表名带uuid的就是用uuid作为主键。大家看一下就知道性能差距了:

如上图所示,当主键是UUID的时候,插入时间更长,而且占用空间更大!

额,大家千万不要忘了,当你回答自增主键后,想一下

ps:这个问题,你要是能把UUID讲出合理的理由也行。

问题3:主键为什么不推荐有业务含义?

回答:有如下两个原因

问题4:表示枚举的字段为什么不用enum类型?

回答:在工作中表示枚举的字段,一般用tinyint类型。

那为什么不用enum类型呢?下面两个原因

(1)ENUM类型的ORDER BY操作效率低,需要额外操作

(2)如果枚举值是数值,有陷阱

举个例子,表结构如下

CREATE TABLE test (foobar ENUM('0''1''2'));

此时,你执行语句

mysql> INSERT INTO test VALUES (1);

qq的戳一戳_是吃鸡要吃老母鸡,戳b要戳排骨b_mysql时间戳

查询出的结果为

foobar

0

就产生了一个坑爹的结果。

插入语句应该像下面这么写,插入的才是1

mysql> INSERT INTO test VALUES (`1`);

问题5:货币字段用什么类型?

qq的戳一戳_mysql时间戳_是吃鸡要吃老母鸡,戳b要戳排骨b

回答:如果货币单位是分,可以用Int类型。如果坚持用元,用Decimal。

千万不要答float和double,因为float和double是以二进制存储的,所以有一定的误差。

打个比方,你建一个列如下

CREATE TABLE `t` (
  `price` float(10,2DEFAULT NULL,
ENGINE=InnoDB DEFAULT CHARSET=utf8

然后insert给price列一个数据为1234567.23,你会发现显示出来的数据变为1234567.25,精度失准!

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

回答:此题无固定答案,应结合自己项目背景来答!把理由讲清楚就行!

(1)varchar,如果用varchar类型来存时间,优点在于显示直观。但是坑的地方也是挺多的。比如,插入的数据没有校验,你可能某天就发现一条数据为2013111的数据,请问这是代表2013年1月11日,还是2013年11月1日?

其次,做时间比较运算,你需要用STR_TO_DATE等函数将其转化为时间类型,你会发现这么写是无法命中索引的。数据量一大,是个坑!