mysql---表结构优化
1、数据类型的选择
1.1数字类型
非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。
固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。
对于整数的存储,在数据量较大的情况下,建议区分开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,建议添加unsigned定义。当然,如果数据量较小的数据库,也可以不用严格区分三个整数类型。
int(1) int(10) 只是显示左侧补齐0,设置zerofill才有效,对实际存储无影响。
1.2字符类型
非万不得已不要使用 TEXT 数据类型,其处理方式决定了他的性能要低于char或者是varchar类型的处理。
定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。
varchar(10) varchar(100) 影响实际存储空间,指定的是存储空间
1.3时间类型
尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。如果插入时没有指定第一个TIMESTAMP列的值,MySQL则设置该列的值为当前时间。
对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。
1.4 ENUM & SET
对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。
如果是存放可预先定义的属性数据呢?可以尝试使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。
1.5 LOB类型
强烈反对在数据库中存放 LOB 类型数据,虽然数据库提供了这样的功能,但这不是他所擅长的
2、适当拆分
大字段或者不常用的字段可以单独存放,减少IO
3、适当冗余
根据具体业务,例如被频繁join的两张表,可以进行冗余减少join的使用
4、尽量使用NOT NULL
NULL 类型比较特殊,SQL 难优化。虽然 MySQL NULL类型和 Oracle 的NULL 有差异,会进入索引中,但如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。此外,NULL 在索引中的处理也是特殊的,也会占用额外的存放空间。
5、数据库引擎的选择
5.1myisam
如果表对事务要求不高,同时是以查询和添加为主的,考虑myisam储存引擎(如bbs的发帖表和回复表);
5.2innodb
对事务要求高,保存的数据都是重要的数据,建议使用innodb储存引擎(如账号表、订单表等重要的表);
5.3memory
数据变化频繁,不需要入库,同时又频繁的查询和修改,可考虑使用memory储存引擎(注意:插入的数据不会被持久化到磁盘空间,只是临时保存到了内存中,关闭了数据就会丢失);
学习之后,随时补充。。。。。。