【问题标题】:Is Denormalization good for performance非规范化对性能有好处吗
【发布时间】:2012-03-01 21:30:15
【问题描述】:

首先对不起我的英语。

我正在研究一个包含大约一百万条记录的数据库。大约有 10 个表,所有表都使用外键连接。因此,假设我为其保存记录的实体是人。所以在 1 个表中,我在其他表中有人员详细信息,我有他的工作信息等。我的意思是说我的数据库现在非常规范化。为了获取数据,我正在运行包含多个连接的查询,并且我正在正常时间获取数据。但是我在一些论坛/技术博客上看到,如果我们只想选择数据,那么非规范化数据库可以显着提高性能。我试过用我自己的数据库来做这件事,我做了一个“denormal_data”列。在使用它时,我意识到我的表变得更大了,现在它包含超过 50 列。好吗 ?我真的需要一个非规范化的数据库表吗?这是一个好习惯吗?

嗯,它最有可能是一般性讨论,然后是任何类型的问题,仅用于学习目的。任何形式的专家建议都将受到高度赞赏。

谢谢

【问题讨论】:

  • 有时它会有所帮助,但这取决于您的具体情况。您能否提供有关您的表和连接的更多详细信息?

标签: sql denormalization


【解决方案1】:

我在互联网上读到服用某些药片可以提高我与女士们相处的机会,但我并不相信我读到的所有内容。你也不应该。

标准化是一件好事 - 在您用尽所有其他途径以获得更好的性能之前,不要将其丢弃。

你所有的表都应该有主键。

你所有的外键都应该有索引; WHERE 子句中的所有列也应如此。

如今,一百万条记录并不是一个大型数据库,除非您使用的是 Access 之类的东西,它是为单用户桌面应用程序设计的。

您应该对所有查询进行解释计划,以了解它们的执行情况。

如果不先获得一些有意义的数据,我不会改变任何东西。除非你有一个好的基线,否则你不会知道你是否真的有问题或者治愈是否有效。

【讨论】:

  • +1 因为我要说同样的话。我还要补充一点,一个好的数据库设计在数据相关时将数据保持在一起,而在不相关时将数据分开。如果您有“客户”的业务概念,但需要跨多个表执行平面连接以从数据库中获取基本的“客户”记录,则应考虑合并数据。
  • +1 谁说“过早优化是万恶之源”?
【解决方案2】:

事实上,当需要计算大量数据时,反规范化很有用。例如,在论坛中,我们使用名为“message_number”或“topic_length”的列来避免性能非常贪婪的函数“count”。

我认为有很多方法可以通过非规范化来提高数据库的性能,但您必须小心。

【讨论】:

    【解决方案3】:

    非规范化是一种在您需要时可用的策略。当您需要它时,当数据库性能对您的应用程序产生负面影响时并且您已经尝试了所有更简单的技巧(索引等)。非规范化不是免费的。您必须手动完成原本不需要的事情(例如,您想更新用户的电子邮件地址?在它显示的所有 5 个表格中进行)。

    tl;dr:仅在需要时使用它。你可能不需要它。

    【讨论】:

      【解决方案4】:

      如果您想使用非规范化,请创建第二组定期同步的表,其中包含您希望以非规范化格式快速访问的数据。这将是陈旧的数据(但它不会在刷新后立即出现吗?),您应该指出它有多旧。

      您可能还想查看术语CQRS

      【讨论】:

        猜你喜欢
        • 2012-10-08
        • 2014-06-06
        • 2018-01-04
        • 1970-01-01
        • 2021-09-22
        • 2011-01-27
        • 1970-01-01
        • 2011-02-15
        • 2017-02-06
        相关资源
        最近更新 更多