选择优化的数据类型 (三)CHAR与VARCHAR

VARCHAR和CHAR

(这里假设使用的是InnoDB或MyISAM)

VARCHAR:

它能比固定长度的类型占用的更少的存储空间,因为它只占用了自己需要的空间(也就是说较短的值占用的空间就较少)。例外情况是使用ROW_FORMAT=FIXED创建MyISAM表,它为每行使用固定长度的空间,可能会造成浪费。

varchar使用额外1到2个字节来存储值长度。如果列的的最大长度小于或等于255时,则使用1字节,否则则使用2字节。

varchar能节约空间,所以对性能有帮助。然而由于行的长度是可变的,它们在更新的时候可能会发生变化 ,这会引起额外的工作。如果行的长度增加并不适合于原始的位置时,具体的行为则会和存储引擎相关。例如,MySIAM会把行拆开,InnoDb则可以会分页。另外的存储引擎还可能不会在合适的位置更新数据。

当最大长度远大于平均长度,并且很少发生更新的时候,通常适合使用varchar。还有当你使用复杂的字符集时,如UTF-8,它的每个字符都可能占用不同的存储空间。

在5.0及以上版本,无论是保存还是取值,mysql都会保留字符串末尾的空格。但是在4.1及之前的版本,这些空格会被去掉。

CHAR:

char是固定长度的,当保存char值的时候,mysql会去掉任何末尾的空格。进行比较的时候,空格会被填充到字符串末尾。

char适合存储用户密码的MD5哈希值,它的长度总是一样的。对于经常改变的值,char也好于varchar,因为固定长度的行不容易产生碎片,对于很短的列,char的效率也高于varchar。char(1)字符串对于单字节字符集只会占用一个字节,但是varchar(1)则会占用2个字节,因为1个字节用来存储长度信息。


char和varchar的兄弟类型是binary和varbinary,它们用于保存二进制字符串。二进制字符串和传统的字符很类似,但是它们保存的是字节,而不是字符,填充也有所不同。mysql用\0(0 字符)填充binary值,而不是空格,并且不会在获取数据的时候把填充的值去掉。(如果不想在取值的时候,值发生改变,就不要使用binary,因为mysql会用\0把它填充到需要的长度)。


varchar(5)和varchar(200)保存'hello'所占用的空间是一样的,那么使用较短的列有什么优势吗?

其实在巨大的优势,较大的列会使用更多的内存,因为mysql通常会分配固定大小的内存块来保存值。这对排序或使用基于内存的临时表尤其不好,同样的事情也会发生在使用文件排序或基于磁盘的临时表的时候。

最好的策略就是只分配需要的空间.

猜你喜欢

转载自lobert.iteye.com/blog/1647844