CHAR 和VARCHAR
CHAR 、VARCHAR 都用来存储字符春,东汉时它们保存和检索的方式不同。CHAR 属于固定长度的字符类型,而VARCHAR 属于可变长度的字符类型。
由于CHAR 是固定长度的,所以他的处理速度比VARCHAR 快很多,但是其缺点是浪费存储空间。程序需要对行尾的空格进行处理,所以对于那些长度变化不大并且对查询速度有要求的数据可以考虑使用CHAR 类型来存储。
不同的存储引擎堆CHAR 和VARCHAR 的使用原则有所不同:
- MyISAM:建议使用固定长度的数据序列代替可变长度的数据列
- MEMORY:目前都使用固定长度狮王数据行存储,因此无论使用CHAR或VARCHAR 列都没有关系。两者都作为CHAR 类型处理
- InnoDB:建议使用VARCHAR类型。对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度(所有数据行使用的都是指向数据列值的头指针),因此在本质上,使用固定长度的CHAR 列不一定比使用可变长度的VARCHAR 性能好。因而,主要的性能因素是数据行使用的存储总量。由于char 平均占据的空间多余VARCHAR ,因此使用VARCHAR 来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。
TEXT 和BLOB
在存储较大文本是通常使用TEXT 或者 BLOB ,两者主要的区别是BLOB 可以用来保存二进制数据,比如照片;而TEXT 只能保存字符数据.
TEXT 和BLOB 值会引起一些性能问题,特别是在执行了大量的删除数据操作时。删除数据会在表中留下很大的空洞很大的“空洞”,以后填入这些空洞的记录再插入性能上会有影响。为了提高性能,建议使用 OPTIMIZE TABLE 功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。
测试案例:
Create table t (id varchar(100), context text);
Insert into t values ( 1, repeat(‘haha’,100);
Insert into t values ( 2, repeat(‘haha’,100);
Insert into t values ( 3, repeat(‘haha’,100);