数据库表设计之慷慨是不明智的

今天没事的时候翻了翻《高性能的mysql》,看了一个很简单的章节,但是也让我收获了一个不小惊喜。看的是mysql的数据类型,可能大家会觉得可笑,mysql的数据类型有什么好看的?下面我就来讲解一下我的发现。

char 和 varchar究竟该如何选用?

这个问题大家猛然一看很简单,但是仔细一想会发现并不知道该怎么选用,因为我们大部分的时候都会选择varchar,我甚至去看了我们的数据库的表设计,其实也是很多字段都是varchar的,甚至此时的我来看,这些做法是错误的。

可能大家都知道char是一个定长的字符串,而varchar是一个非定长的字符串,怎么理解呢?如下设计:

col char(10)

如果col字段如上设计,我们存入一个“hello”,那么此时数据库存储的其实是"hello ",会自动填充空格保持定长。但是如果你设计成varchar(10),就不会补充空格。这么来看varchar类型是不是很好用???那么我们就来深究一下varchar类型的缺点。

缺点一:浪费空间

varchar在实现不动态填充空格时,开辟一定的空间来记录真实的字符长度,而这部分空间,无论是对于磁盘空间来说还是读取到内存里都是额外的开销。

缺点二:会带来页分裂

我们知道数据库的数据都是按表存放的,但是表下面还有页的概念,并且每页是固定大小,默认是16K,那么我们想象一个问题,某一个设计为varchar的字段做update操作,由一个短串变成了一个长串,那么再假设变更后的长串原有页的空间不够了,那么此时页就要分裂重组,这个开销是很大的。

一下子说了varchar的俩个缺点,那是不是不要用varchar好了,并不是这样的,下面我们来看varchar的优点。

优点一:节省空间

是的,你没看错,就是节省空间,因为varchar有一个好处是即使你设置了长度255,但是你就存一个字那么就会占用一个字的空间,而char则会填充254个空格,这么一看varchar的优越性就极高,比如说你的一个字段存储的数据大部分是平均值以下,那么就会节省不小空间。
varchar图示
在这里插入图片描述
char图示
在这里插入图片描述

分析了优缺点,那么varchar和char到底该如何选用?

  • 如果你的字段是存放定长的字段,那么很合适选用char,像我们系统里的订单号、商户号其实应该选用char的。
  • 如果你的字段是不定长,且修改不频繁的,就可以选用varchar,例如评论或者备注。
扫码关注公众号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值