高性能MySql阅读笔记第四章--Schema与数据类型优化阅读笔记2
Mysql schema设计
一.Mysql schema设计中的陷阱
1.当心自动生成的schema。写的很烂的schema迁移程序,或者自动生成的schema的程序,都会导致严重的性能问题。
2.太多的列。Mysql的存储引擎API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列。从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的。
3.太多的关联。
4.全能的枚举。
5.变相的枚举。
6.非此发明的NULL。之前写了避免使用NULL的好处,并且建议尽量的考虑代替方案。但是遵循这个原则不要走极端,例如从特定类型的值域中选择一个不可能的值(-1)代替NULL,可能导致代码复杂很多,并且容易引入bug,处理NULL确实不容易,但有时候会比他的替代方案更好。
二.范式和反范式
对于任何给定的数据通常都有很多种表示方法,从完全的范式化到完全的反范式化,以及两者的折中。在范式化的数据库中,每个事实数据出现并且只出现一次。相反,在反范式的数据库中,信息是冗余的,可能会存储在多个地方。
1.范式的优点和缺点。
优点:
范式的更新操作通常比反范式要快。
当数据较好的范式化是,就只有很少或者没有重复的数据,所以只需要修改更少的数据。
范式化的表通常更小,可以更好的存放在内存里,所以执行操作会更快。
很少有多余的冗余数据意味着检索列表数据时更少需要DISTINCT或者GROUP BY语句。
缺点:
范式schema的缺点是通常需要关联,稍微复杂一些的查询语句在符合范式的schema上都可能需要至少一次关联。
2.反范式的优点和缺点。
优点:
反范式的schema因为所有数据都在一张表中,可以很好的避免关联。
3.混用范式化和反范式化。
事实上,完全范式化和完全反范式化都是实验室里才有的东西。最常用的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列,可以使用触发器更新缓存值,这使得实现这样的方案变得更简单。
四.缓存表和汇总表
有时候提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候也需要创建一张完全独立的汇总表或缓存表,这是非常好的方法。
五.物化视图。
物化视图实际上是预先计算并且存储在磁盘上的表,可以通过各种各样的策略刷新和更新。
六.计数器表。预制行。
七.加快ALTER TABLE操作的速度。通过MODIFY COLUMN,ALTER COLUMN操作来改变列的默认值。
八.只修改.frm文件。
下面这些操作可能不需要重建表。
1.移除一个列的 AUTO_INCREMENT属性。
2.增加,移除或更改ENUM和SET常量,如果移除的是已经有行数据用到的常量,查询将会返回一个空字符串。
总结:
良好的schema设计原则是普遍适用的,但Mysql有他自己的实现细节要注意,概括起来说,尽可能保持任何东西小而简单总是最好的。
高性能MySql阅读笔记第四章--Schema与数据类型优化阅读笔记2
原文:http://www.cnblogs.com/zechac/p/5240375.html