字段优化的最终原则是:使用可以正确存储数据的最小的数据类型。1)整数类型
MySQL提供了6种整数类型,分别是:
- tinyint
- smallint
- mediumint
- int
- integer
- bigint
不同的存储类型的最大存储范围不同,占用的存储的空间自然也不同。
例如,是否被删除的标识,建议选用tinyint,而不是bigint。
2)字符类型
你是不是直接把所有字符串的字段都设置为varchar格式了?甚至怕不够,还会直接设置成varchar(1024)的长度?
如果不确定字段的长度,肯定是要选择varchar,但是varchar需要额外的空间来记录该字段目前占用的长度;因此如果字段的长度是固定的,尽量选用char,这会给你节约不少的内存空间。
3)非空
非空字段尽量设置成NOT NULL,并提供默认值,或者使用特殊值代替NULL。
因为NULL类型的存储和优化都会存在性能不佳的问题,具体原因在这里就不展开了。
4)不要用外键、触发器和视图功能
这也是「阿里巴巴开发手册」中提到的原则。原因有三个:
- 降低了可读性,检查代码的同时还得查看数据库的代码;
- 把计算的工作交给程序,数据库只做好存储的工作,并把这件事情做好;
- 数据的完整性校验的工作应该由开发者完成,而不是依赖于外键,一旦用了外键,你会发现测试的时候随便删点垃圾数据都变得异常艰难。
5)图片、音频、视频存储
不要直接存储大文件,而是要存储大文件的访问地址。
6)大字段拆分和数据冗余
大字段拆分其实就是前面说过的垂直分表,把不常用的字段或者数据量较大的字段拆分出去,避免列数过多和数据量过大,尤其是习惯编写SELECT *的情况下,列数多和数据量大导致的问题会被严重放大!
字段冗余原则上不符合数据库设计范式,但是却非常有利于快速检索。比如,合同表中存储客户id的同时可以冗余存储客户姓名,这样查询时就不需要再根据客户id获取用户姓名了。因此针对业务逻辑适当做一定程度的冗余也是一种比较好的优化技巧。