Database 反规范化以何种方式提高数据库性能?

Database 反规范化以何种方式提高数据库性能?,database,performance,database-design,normalization,denormalization,Database,Performance,Database Design,Normalization,Denormalization,我听说了很多关于非规范化的事情,这是为了提高某些应用程序的性能。但我从未尝试过做任何相关的事情 所以,我只是好奇,规范化数据库中的哪些地方会使性能变差,或者换句话说,什么是非规范化原则 如果需要提高性能,如何使用此技术 反规范化通常用于: 避免一定数量的查询 删除一些连接 反规范化的基本思想是添加冗余数据,或将一些数据分组,以便能够以较小的成本更轻松地获取这些数据;哪个更适合表演 一个简单的例子 考虑一个博客的“Posts”和“Comments”表 对于每个帖子,“评论”表中都有几行

我听说了很多关于非规范化的事情,这是为了提高某些应用程序的性能。但我从未尝试过做任何相关的事情

所以,我只是好奇,规范化数据库中的哪些地方会使性能变差,或者换句话说,什么是非规范化原则


如果需要提高性能,如何使用此技术

反规范化通常用于:

  • 避免一定数量的查询
  • 删除一些连接
反规范化的基本思想是添加冗余数据,或将一些数据分组,以便能够以较小的成本更轻松地获取这些数据;哪个更适合表演


一个简单的例子

  • 考虑一个博客的“Posts”和“Comments”表
    • 对于每个帖子,“评论”表中都有几行
    • 这意味着要显示包含相关评论数的帖子列表,您必须:
      • 执行一个查询以列出帖子
      • 对每篇文章进行一次查询,以计算其评论数量(是的,这些评论可以合并为一个评论,以便一次获得所有文章的评论数量)
      • 这意味着有几个问题
  • 现在,如果在Posts表中添加“评论数”字段:
    • 您只需要一个查询即可列出帖子
    • 并且不需要查询Comments表:注释的数量已经非标准化为Posts表
    • 只有一个查询返回一个或多个字段比多个查询更好
现在,有一些成本,是的:

  • 首先,这会在磁盘和内存中占用一些空间,因为您有一些冗余信息:
    • 注释数存储在Posts表中
    • 你也可以在评论表中找到这些数字
  • 其次,每次有人添加/删除评论时,您必须:
    • 当然,保存/删除评论
    • 同时,更新Posts表中的相应编号
    • 但是,如果你的博客上阅读的人比写评论的人多得多,这可能不是那么糟糕

    • 非规范化是一种时空权衡。规范化数据占用更少的空间,但可能需要连接来构造所需的结果集,因此需要更多的时间。如果它是非规范化的,数据将在多个地方复制。这样会占用更多空间,但所需的数据视图随时可用

      还有其他时空优化,例如

      • 非规范化视图
      • 预计算列

      与上述任何一种方法一样,这提高了读取数据的效率(因为数据随时可用),但更新数据的成本更高(因为需要更新复制或预计算的数据)。

      请考虑具有适当规范化父子关系的数据库

      假设基数是2x1的平均值

      您有两个表,父表,有p行。具有2xp行的子级

      联接操作意味着对于p个父行,必须读取2xp个子行。读取的总行数为p+2xp

      考虑将其反规范化为一个只有子行的表,2xp。读取的行数是2xp


      更少的行==更少的物理I/O==更快。

      如果您有某些要求,如报告等,它可以通过各种方式帮助您的数据库反规范化:

      • 引入某些数据复制以保存一些联接(例如,将某些信息填入一个表中,并对复制的数据表示满意,这样就不需要通过联接另一个表来查找该表中的所有数据)

      • 您可以预先计算某些值并将它们存储在表列中,而不是每次查询数据库时都动态计算它们。当然,随着时间的推移,这些计算值可能会变得“过时”,您可能需要在某个时间点重新计算它们,但仅读取固定值通常比计算某些内容(例如,计算子行)更便宜

      当然,有更多的方法可以对数据库模式进行非规范化以提高性能,但您只需要知道,这样做确实会给自己带来一定程度的麻烦。在做出这些决定时,您需要仔细权衡利弊——性能优势与您自己面临的问题。

      非规范化这个词会导致设计问题的混淆。试图通过非规范化来获得高性能数据库就像试图开车离开纽约到达目的地一样。它不会告诉你该走哪条路

      你需要的是一个好的设计规范,一个能够产生简单而合理的设计的规范,即使这种设计有时与规范化规则相冲突

      星型模式就是这样一种设计原则。在星型模式中,单个事实表充当星型表的中心。其他表称为维度表,它们位于模式的边缘。维度通过看起来像轮子辐条的关系连接到事实表。星型模式基本上是一种将多维设计投射到SQL实现上的方法

      和星型模式密切相关的是雪花模式,它稍微复杂一些

      如果您有一个好的星型模式,您将能够通过不超过三路连接(包括两个维度和一个事实表)获得各种各样的数据组合。不仅如此,许多OLAP工具将能够自动破译您的星型设计,让您无需进一步编程即可点击、向下搜索和图形分析访问数据

      星型模式设计偶尔会违反第二和第三范式,但它会提高报告和摘要的速度和灵活性。它最常用于d