黑马程序员技术交流社区

标题: 【广州python】MySQL数据库访问性能优化之数据表优化 [打印本页]

作者: dingliu    时间: 2018-8-2 17:50
标题: 【广州python】MySQL数据库访问性能优化之数据表优化
本帖最后由 dingliu 于 2018-10-23 10:32 编辑

一、经典的‘三范式’
第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

经典的三范式在现代的一些场景中可能已经不再使用,于是出现了更多类似以空间换时间等提升访问效率的方法。

二、数据类型选择
数字类型:尽量不使用DOUBLE,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,对于整数的存储,建议区分开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,建议添加unsigned定义。
字符类型:尽量不使用 TEXT 数据类型,定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,设定适当的最大长度。
时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。
ENUM:状态字段使用 ENUM ,可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。

三、字符编码
字符集直接决定了数据在MySQL中的存储编码方式,同样的内容不同字符集所占用的空间大小有较大的差异,使用合适的字符集,可以帮助我们减少数据量,进而减少IO操作次数。
纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间
不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,这会造成大量的存储空间浪费

三、适当拆分
如果表中存在 TEXT 或者是很大的 VARCHAR大字段,大部分访问这张表的时候都不需要这个字段,可将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。

四、适度冗余
被频繁引用的两张表中的某些小字段需要通过 Join 方式才能得到,每次Join仅仅只是为了取得某个小字段的值,Join到的记录又大,会造成大量不必要的 IO,可以通过空间换取时间的方式来优化。
扫码关注黑马视频库公众号,免费获取黑马全学科视频教程







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2