今天在看《mysql性能优化》,偶然发现了一些从不知道的秘密,又去跟同事说,同事不知道,我还没说明白,好尴尬。所以从网上查了一下资料并且开启本地测试库测试。
一、char与varchar
char:分配固定长度。
varchar:根据实际存入值分配空间,可设置最大值。
不同处:
一、存储方式:
char:在空间上分配固定长度,把实际存入的值后面补齐空格,在取出时去掉空格。
varchar:在空间上分配传入值长度 + 记录长度值(1字节,或者2字节),早期版本4.1会剔除空格。[Ps:不知道这个记录长度值什么时候用。]
二、内存:
由于mysql优化,会分配固定大小内存保存内存值。varchar(200)会比varchar(100)占用的内存大,由于varchar会多出记录长度位,varchar(100)会比char(100)占用的内存大。
总结:char占用空间大。内存空间比varchar小一个记录长度位。char因为固定长,储存空间连续。查询速度快。
1,频繁更改的字段不要设置为varchar,可能会出现空间碎片。不同的储存引擎处理方式不一样,MyISAM把行拆成不同的片段储存,Innodb分裂页把行放入页中。
2,确定长度的属性用char。比如:orderId、openId。
3,属性字段长度短时不要用varchar,因为会多存储长度记录位。
二、静态表和动态表
在表属性上可以直接设置表为动态表或者静态表。
动态表:其中的char全部失效,变为varchar。
静态表:其中varchar全部失效,变为char。
// 测试所用sql语句
// 查询表属性值
show table status from datebaseName like 'tableName';
//更改row_format值
ALTER TABLE `student` Row_format = dynamic;
//更改存储引擎
alter table student engine=myisam;
其中Row_format为控制属性。拥有如下值:
[DEFAULT, FIXED(静态), DYNAMIC(动态), COMPRESSED, REDUNDANT, COMPACT ]
InnoDb不支持改变row_format值,默认为COMPACT。
MyIASAM支持,默认为Dynamic。
参考来自:mysql高性能书籍_第3版、大量网页博客