我爱编程

mysql---表结构优化

2018-05-15  本文已影响0人  躬行者_白

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储存引擎(注意:插入的数据不会被持久化到磁盘空间,只是临时保存到了内存中,关闭了数据就会丢失);


学习之后,随时补充。。。。。。


上一篇 下一篇

猜你喜欢

热点阅读