Skip to main content

优化模式和数据类型

info

《高性能MySQL》第三版第四章读书笔记

选择最佳数据类型

如何选择最佳数据类型,需要遵循如下几点:

  • 更小通常更好:从磁盘、内存、CPU缓存的角度来说,在确定数据范围的情况下,应该尽量选择范围最小的数据类型
  • 简单就是好:别拿"1"当1用,别拿字符串存储时间、IP地址
  • 尽量避免NULL:除非有特定意图,默认给列加上not null限制
NULl字段到底带来什么危害?
  1. 索引、索引统计、值比较过程更加复杂
  2. Nullable列需要额外存储空间和处理
  3. Nullable列作为索引需要额外一个字节,在MyISAM存储引擎下会使定长索引转为变长索引

😄不要指望从NULl到NOT NULL会带来显著性能提升

接下来是选择更加具体的类型配置,比如数值类型选择INT还是DECIMAL,时间类型选择DATETIME还是TIMESTAMP,按照大类逐一介绍:

整数

MySQL提供TINYINT、SMALLINT、MEDIUMINT、INT以及BIGINT,依次对应8、16、24、32、64二进制位长度的整数,默认是有符号整数(加上UNSIGNED为无符号)

显示长度INT(11)

整数声明后面的(n)表示它的显示长度而不是取值范围,仅用于MySQL客户端显示格式

实数

又称浮点数,但也可用来存储整数(DECIMAL),FLOAT和DOUBLE存储会有精度丢失,DECIMAL保存时精度更高

实数还可以指定长度和精度,对于MySQL 5.0及其之后版本,每9个数字用4个字节存储。比如DECIMAL(18, 9),小数点左边有18-9=9个数字,需要4个字节,小数点右边有9个数字,也需要4个字节,加上小数点需要一个字节,一共9个字节

DECIMAL和DOUBLE

DECIMAL仅仅只是一种存储格式,表示精度更准确,在计算时会被转为DOUBLE,在相同范围内DECIMAL比DOUBLE占用更少空间

字符串

  • VARCHAR:当字符串长度小于255时,使用额外一个字节存储长度,等于255时使用两个字节存储长度。相比于定长字符串节省空间,但是当更新字符串时,需要重新分配空间
  • CHAR:定长字符串,