我试图坚持保持数据库规范化的做法,但这导致需要运行多个连接查询.如果许多查询使用连接而不是调用可能包含冗余数据的单个表,是否会降低性能?
保持数据库规范化直到你发现了瓶颈.然后,只有在仔细分析后才能进行反规范化.
在大多数情况下,拥有一套良好的索引和最新统计数据将解决大多数性能和阻塞问题,而不会出现任何非规范化.
如果存在写入以及对其进行读取,则使用单个表可能会导致性能下降.
人们相信迈克尔·杰克逊(不是那个人)曾说过,
程序优化的第一条规则:不要这样做.
程序优化的第二条规则 - 仅限专家:不要这样做.
这可能是在RDBMS出现之前,但我认为他已经扩展了规则以包含它们.
使用标准化数据模型几乎总是需要多表SELECT; 正如这种问题经常出现的那样,对"非规范化"的"正确"答案是什么?问题取决于几个因素.
DBMS平台.
多表与单表查询的相对性能受应用程序所在平台的影响:查询优化程序的复杂程度可能会有所不同.例如,根据我的经验,MySQL在单表查询上的速度非常快,但并不能很好地优化具有多个连接的查询.对于较小的表(比如说不到10K行),这不是一个真正的问题,但是对于大型(10M +)表来说真的很痛.
数据量
除非您正在查看100K +行区域中的表,否则几乎不应该成为问题.如果您正在查看数百行中的表大小,我甚至不会考虑索引.
(解)归一化
规范化的重点是尽量减少重复,以确保只需要在一个地方更改必须更新的任何字段值.非规范化打破了这一点,如果对重复数据的更新很少(理想情况下它们永远不会发生),这就不是什么大问题了.因此,在复制除最静态数据之外的任何内容之前要仔细考虑,注意您的数据库可能会显着增长
要求/约束
您想要满足哪些性能要求?你有固定的硬件或预算吗?有时,通过硬件升级可以最轻松地实现性能提升 - 甚至是最便宜的.您期望什么交易量?小型企业会计系统与Twitter有着截然不同的形象.
最后一个想法让我感到震惊:如果你足够不规范,你的数据库与平面文件有什么不同?SQL对于灵活的数据和多维的retieval来说是极好的,但它可以比直接顺序或相当简单的索引文件慢一个数量级(至少).