范式化--schema设计趋向于符合三范式
优点
- 更少或者没有数据冗余
- 因为第1点,所以数据更新只更新一个字端。意味着更快的更新速度。
- 表体积更小
- 查询多数无需distinct去重
缺点
- 表数量更多
- 因为第1点,需要建立更多的索引
- 多数查询都需要多表关联!!!
- 因为第3点,关联查询极有可能导致索引无效
反范式化
优点
- 数据在一个表,避免关联查询的性能消耗
- 减少多表建立索引开销
- 最差情况:查询时全表扫描,也大概率是顺序IO;比关联查询的随机IO快
缺点
- 存在数据冗余,尤其不适合数据一致性要求很高的需求。
- 过多列—mysql服务器层和存储引擎API之间通过【行缓冲】拷贝数据。在服务器层将缓冲内容解码成各个列。当列过多会导致解码消耗性能过大。随之而来的是CPU飙高。
最佳实践-范式和反范式的混用
例如:
范式化订单表和订单明细表。但反范式主表缓存明细条数,避免查询时统计明细数量;如果用户名不支持修改,主表缓存用户名。避免每次关联查询用户表。