优化模式和数据类型
info
《高性能MySQL》第三版第四章读书笔记
选择最佳数据类型
如何选择最佳数据类型,需要遵循如下几点:
- 更小通常更好:从磁盘、内存、CPU缓存的角度来说,在确定数据范围的情况下,应该尽量选择范围最小的数据类型
- 简单就是好:别拿"1"当1用,别拿字符串存储时间、IP地址
- 尽量避免NULL:除非有特定意图,默认给列加上not null限制
NULl字段到底带来什么危害?
- 索引、索引统计、值比较过程更加复杂
- Nullable列需要额外存储空间和处理
- 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:定长字符串,