高性能MySql阅读笔记第四章--Schema与数据类型优化阅读笔记2

高性能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)