MySQL数据类型的优化选择
整数类型:
Tinyint-8
Smallint-16
Mediumint-24
Int-32
Bigint-64
实数类型(带有小数部分的数字)
Float-4/double-8:浮点
Decimal:精确(只是存储格式,在计算中会转为double类型)
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。
字符串类型:
Varchar:可变长字符串(需要1-2个字节存储字符串长度)
优点:比定长类型节约空间;
缺点:碎片问题。字符串update变长时,一个行的占用空间变长,但是在页内没有更多空间存储,MYISAM将行拆成不同片段存储,InnoDB分裂页使行可以放进页内;
适用:字符串最大长度比平均长度大很多;列的更新很少;
Char:定长字符串(mysql会删除所有末尾空格)
优点:不易产生碎片
适用:存储密码的MD5值;经常变更的数据;
大型数据类型:
Blob:二进制
Text:字符
特殊性:mysql将blob和text值当做一个独立的对象处理,当值太大时,innodb在值内存储一个指针,外部存储区域存储实际的值;mysql对blob和text的排序,只对每列的最前max_sort_length进行排序;mysql不能将列的全部长度字符串进行索引,也不能使用这些索引进行排序;
枚举类型ENUM:
mysql在存储枚举类型时非常紧凑;
Mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”的映射关系的查找表;
缺点:字符串列表是固定的,添加或删除字符串都需要alter table;
优点:可以缩小表的大小;主键减小后,innodb表的非主键索引也会变小;
关联速度:enum列 关联 enum列 > varchar列 关联 varchar列 > enum列 关联 varchar列
日期时间类型:
Datetime:8字节;与时区无关;保存大范围的值,从1001年到9999年,精度为秒;
Timestamp(尽量使用):4字节;依赖于时区;保存1970.1.1以来的秒数;列默认为not null;
Timestamp的特殊性:如果插入数据时没有指定第一个timestamp列的值,mysql则设置这个值为当前时间;