今天没事的时候翻了翻《高性能的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,例如评论或者备注。