1. 数据类型优化
- 更小的通常更好。占用更小的磁盘、内存和cpu缓存
- 简单就好。整型比字符串操作代价更低,因为字符集和校对规则字符串比整型更复杂;使用mysql自建类型而不是字符串存储日期
- 尽量避免null。查询中包含null的列,对mysql来说很难优化。
- https://www.cnblogs.com/balfish/p/7905100.html
- NULL值到非NULL的更新无法做到原地更新,更容易发生索引分裂,从而影响性能。
- NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回永远为空结果,查询容易出错
1.1 实际细则
1.1.1 整数类型
TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。 (一个字节是8位)
1.1.2 字符串类型
- varchar(根据内容实际长度保存数据)
- varchar(n) n小于等于255使用额外一个字节保存长度,n>255使用额外两个字节保存长度。
- varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小(比如将行从存储引擎层复制到SQL层时,VARCHAR将转换字段CHAR以获得利用固定宽度行的优势。因此,内存中的字符串将填充到声明的VARCHAR列的最大长度)
- 使用场景
- 字符串更新少的,每次更新都要重新计算,使用额外的空间保存长度
- 保存多字节字符,如汉子,特殊字符等
- 存储长度波动大的数据
1.1.3 字符类型
- 最大长度255
- 自动删除掉末尾空格
- 检索效率、写效率比varchar高,以空间换时间
- 场景
1.1.4 datetime类型(不推荐使用,暂用空间大,日期函数也不能用)
- 占用8个字节
- 与时区无关,数据库底层时区配置对datetime无效
- 可保存到毫秒;可保存的范围大,
1.1.5 timestamp类型
- 占用4个字节
- 时间范围:1970-01-01到2038-01-19
- 精确到秒
- 采用整型存储
- 依赖时区设置(自动更新timestamp的值)
1.1.6 date类型
- 占用3个字节
- 可以是日期函数
- 保存1000-01-01到9999-12-31之间的日期
1.1.7 枚举类型
有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,
mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表
备注:添加新值需要重新构建整个表,这可能需要花费数小时,具体取决于表的大小