反范式化设计是针对范式化而言的,就是为了性能和读取效率的考虑而适当对数据库设计范式的要求进行违反,而从而存在少量数据冗余,就是用空间换取时间。
我们不能完全范式化设计,还要考虑如何使用这些表
范式化优点:可以尽量减少数据冗余,跟新操作比反范式化要快,表比反范式化更小
范式化缺点:对于查询需要对多个表进行关联,虽然提高了写操作性能,但是降低了读的性能,在mysql关联成本很高的,就算再简单的查询也要关联一次表。我们需要对表进行适当的反范式化,以减小关联的数量
并且使我们更难对查询进行索引优化。例如将经常使用的列分在不同的表中,这些列在同一个表中可以属于同一个索引。不同表中就无法放到同一个索引中了。
反范式化优点:大部分数据在一张表中,可以减少表的关联,对于不需要关联的表,最差的性能会进行全表扫描。就算是数据比内存大很多,无法在内存中缓存所有表数据,全表扫描也要比关联操作好一些。因为我们使用了Inoodb存储引擎,而对大表的扫描是顺序IO,而关联操作是随机IO
可以更好的进行索引优化,全在一张表中,我们就可以使用覆盖索引以提供最好的性能。如果查询所需要的列在多张表中,就无法使用这种优化方式了
反范式化缺点:存在数据冗余和数据维护异常
对数据修改需要更改更多地方,所以对数据更改成本更高(成本:cpu时间,磁盘IO等等硬件资源或者系统资源)我们需要修改更多的地方
完全的反范式化和安全范式化都不是最好的,我们需要结合反范式化和范式化。