# Mysql Scheme


### 选择优化的数据类型
#### 字符串类型
VARCHAR类型用于存储可变长的字符串，所以它需要1或2个额外的字节记录字符串的长度：如果列的长度小于或等于255个字节，则只使用1个字节表示，否则使用2个字节表示。例如varchar(10)就需要11个字节，varchar(1000)则需要1002个字节。

VARCHAR节省了存储空间，所以对性能有所帮助。但由于行是变长的，在UPDATE时可能是原来的行更长，这就会导致需要做一些额外的工作。如果一个行占用的空间曾长，并且在页内没有更多的空间可以存储，这是INNODB就会分裂当前页来使行可以放进页内。

下面这些情况使用VARCHAR是合适的：
* 字符串列的最大长度比平均长度大很多
* 列的更新很少
* 使用了UTF-8这样的字符集，每个字符都是用不同的字节存储

CHAR类型是定长的：MySQL总是根据定义字符串的长度分配足够空间。因为CHAR会根据需要采用空格填充到字符串末尾，而且当你检索时，CHAR会删除末尾的空格。所以会有一个很有趣的事情发生，当你存储一个"Johnson  "到char(10)时，检索出来的结果却是"Johnson"，因为MySQL并不知道这空格是你存的还是系统自动填充的。

CHAR很适合存储很短的字符串或所有值都接近同一个长度。例如密码的MD5值。

BLOB和TEXT都是为了存储很大的数据类型而设计的字符串数据类型，分别采用二进制和字符方式存储。而且当它们存储的数据过大时，INNOSB会使用专门的‘外部’空间来存储数据，此时每个值的行内仅存储一个1 ～ 4个字节的指针，然后在外部区域存储真实的指。当需要对BLOB和TEXT排序时，它只对每个列的最前 max_sort_length 进行排序。这个值是可以配置的。



