在进行数据库逻辑设计阶段,需要从如下一些细节来考虑数据库性能问题。
A.反范式设计
从第一范式(1NF)到第三范式(3NF),越规范的范式表示表的模式越精确,可以减少冗余数据。在数据量较小的系统中,我们尽量遵守范式要求进行规范化设计。但在实际的系统中,特别是数据量较大的大型系统中,我们往往采用第一范式、第二范式。因为更高的范式要求信息更深的“分离”,这将导致关系越复杂,从而出现更多的表与表的关联操作越频繁。从而影响性能。所以,实际系统中经常采用反规范化—冗余设计。某一字段属于一个表,但它又同时出现在另一个或多个表,代价是需要维护数据的一致性。适当的数据冗余,可以减少表与表之间的连接次数,可以提高查询的性能。我们应该在数据冗余度和性能之间找到合适的平衡点。
B.避免使用外键(foreignkey )
外键能保证数据的完整性和一致性,能够增加ER图的可读性。外键需检验子表与主表数据的关系。如Insert 子表时,需要查询新增记录是否在主表中已存在;在Delete主表时,需要检查是否子表有记录。从而带来较大的开销,特别对于大数据表情况,不应该设计外键,否将带来严重的性能问题。
C.避免使用Trigger
通过trigger可以进行数据关联处理,复杂的trigger处理过程降低性能。因为Trigger采用逐一处理的方式,导致批量处理性能低下。
D.尽可能少使用view
View可以屏蔽底层信息,提高开发简便和提高安全。但是,复杂的view可能导致优化器错误的执行路径。如下只是一个复杂view引起SQL执行计划错误的一个示例,建议对于复杂的SQL,尽量避免使用View方式。
收起