Mysql几个会被问到的面试题

  • 为什么一定要设置一个主键,主键为什么不推荐有业务含义

    答:在不设置主键的情况下,innodb会自动为你生成一个隐藏列,作为自增主键。我们自己通常设置的id为主键,会做作为主键索引来使用。

    如果没有主键,并且也没有一个趋势递增的唯一键,那么所有这些表都会依赖一个全局序列计数器生成的ROW_ID来构造一个隐式聚簇索引,这就会导致竞争从而引起性能问题。
    如果随机主键,那么所有页都会被频繁写入,从而导致无法高效的缓存页。并且频繁的裂变还会导致页填充率不理想,从而额外占用很多的磁盘空间。

    带有业务含义通常都会又可变化性,而且这样的数据不一定是自增的,那么在插入的时候就会造成中间插入的可能性,引发页分裂,产生空间碎片

  • 插入中数据库的枚举(enum),为什么通常会用tinnyInt来代替
    答:ENUM类型的Order By操作效率低,需要额外操作,而且我们在进行插入时,如果枚举中的值为(0,1,2),我们插入的值如果为1时,那么我们插入的应该是对应的0,我们想插入1的话需要加上引号,‘1’.

  • 货币字段应该用什么类型存储
    答:如果货币单位是分,可以用Int类型。如果坚持用元,用Decimal。不要用double或者float类型,因为他们属于二进制存储,当你用float存储价格时,存储和取出的值会不相同。

  • 应该用什么类型存储时间
    答:varchar 可以直接显示出存储的时间,但应该做格式校验,否则可能会存储‘2019111‘格式的数据,这时就无法确定这个时间时1月11日,还是11月1日;
    timestamp(时间戳),它的限制范围为1970-01-01 08:00:01到2038-01-19 11:14:07,也就是超过这个时间是无法存储的,不过它有着一个优化,就是可以改变时区。
    datetime,这个的限制范围就要大的多了,1000-01-01 00:00:00 ~ 9999-12-31 23:59:59(鬼知道地球那个时候还在不在,手动滑稽),这个值不过不会随着时区的转换而改变。

  • 字段为什么要定义not null
    答:通常我们设置的非空字段都是经常查询的字段,也就是说我们应该会引用到索引,如果字段中的值为空的话,会影响索引的处理和使用;其次,如果我们如果以改字段进行查询统计的话,如

idname
1ghost
2Null
3zzz
4Null

那么我们查询出的数据的结果为2,不是4

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值