q36988 发表于 2018-10-6 07:07:04

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则设置这个值为当前时间;

页: [1]
查看完整版本: MYSQL(三)数据类型的优化选择