mysql前期的设计问题会给后期的开发维护造成很大的问题,所以在mysql数据库的设计阶段就应该保证尽可能的高效,尽可能的减小后期开发和维护代价。
如何设计
1.适度冗余, 让query尽量减少join
虽然optimizer会对query进行一定的优化,但有时候遇见复杂的join,优化效果并不令人满意,再加上本来join的性能开销,所以需要尽量的减少join,而需要通过冗余来实现。比如:有两个数据表分别为用户信息表和用户发帖表,在展示发帖列表时,如果没有冗余的话,两个表要join以取得想要的发帖信息和用户昵称,但如果考虑冗余,用户昵称占用空间不大,如果在发帖表里增加这么一个字段的话,在展示列表时就不用做join操作了,性能会得到很大的改善。
但冗余也会带来一些问题,比如在发帖表里增加了用户昵称字段,就得维护两份用户昵称数据,为了保证数据的一致性,在用户昵称发生改变时,就得向两个表做更新操作,程序中就得做更多的处理。但相比的话,更新频率显然不及查询频率,这样通过增加少量的更新操作会换来更大的性能提升,这也是在项目中经常采用的优化手段。
2. 大字段垂直分拆
所谓的大字段,没有一个很严格的标准,常用的是如果一个字段的大小占整条记录的50%以上,我们就视为其为大字段。
大字段垂直分拆相比适度冗余是完全相反的操作,适度冗余是将别的表中的字段放进一个表中,而大字段分拆是将自身的大字段拆分出去放进另一个表中。
这两个优化策略貌似是矛盾的,但要根据具体的应用场景来分析,适度冗余是因为在频率较高的查询中要使用该字段&