VARCHAR和CHAR类型是两种主要的字符串类型.
今天这篇文章我们主要讨论一下VARCHAR和CHAR类型,这里我们以InnoDB做假设。
首先我们先来谈一谈VARCHAR
众所周知,VARCHAR是可变字符串类型。
什么是可变字符串类型呢?
也就是它仅使用必要的空间,也就是越短的字符串使用越少的空间
例如: VARCHAR(5)和VARCHAR(200) 存储 'hello’的空间开销是一样的。
VARCHAR节省了存储空间,所以对性能也是有帮助的!
这时候小伙伴们可能会想到: 芜湖!VARCHAR这么完美,以后就都用VARCHAR存字符串吧
别着急,您继续瞧。
VARCHAR虽然节省了空间,但是因为行是变长的,在UPDATE时可能使行变得比原来更长,这也就导致需要做额外的工作。
就是说,一个行的占用的空间增长,并且在页内已经没有更多的空间存储了,这种情况下InnoDB则需要分裂页使行可以放进页内。
(这里需要大家了解一下行和页的相关知识)
下边给大家推荐几种使用的情况
- 字符串的最大长度比平均长度大很多
- 列的更新很少,所以碎片不是问题
接下来就是CHAR
CHAR类型我们都知道,它是定长的
Mysql会根据定义的字符串长度分配足够的空间
- 适合用来存储较短的字符串
- 或者长度比较固定的字符串(比如密码的MD5值)
关于CHAR似乎没有什么好说的内容。。(以后再补充吧)
最后我们来看一下
朋友们心里可能有个大大的问号
既然VARCHAR(5)和VARCHAR(200) 存储 'hello’的空间开销是一样的。
那以后我们直接VARCHAR(255)不就好了吗?
NONONO
一般来说MYSQL通常会分配固定大小的内存快来保存内布值。
尤其是使用内存临时表进行排序或者操作的时候会变得特别糟糕
在利用磁盘临时表进行排序的时候也特别糟糕
所以,各位,最好的策略还是只分配真正需要的空间