更高效地拥有两个表或一个包含大量字段的表

时间:2012-08-28 22:09:12

标签: mysql performance database-table

相关但不完全相同的事情:which is more effcient?(或至少阅读它并没有帮助我)

所以我正在开发一个新网站(销售保险单)我们已经有几个网站(它是一个rails应用程序)这样做,所以我在我的sql数据库中有一个名为policies的表。 您可以想象它有很多列可以支持所有可用的选项。

在这个新网站上工作时,我意识到我需要跟踪20多个选项。

我担心的是,策略表已经很大了,但它现在的列几乎都被我们拥有的每个应用程序使用。然而,如果我添加它们,它们将仅用于新站点,并且将在所有其他策略上留下大量空单元格。

所以我的问题是,我是将这些添加到现有表中还是仅为该站点上销售的策略创建新表?另外我相信,如果我创建了一个新表,我可以从主策略表中省略一些列(但不是很多),因为这个应用程序不需要它们。

1 个答案:

答案 0 :(得分:3)

“[A]几乎全部使用”表示你可以在考虑之后更自然地分裂它。

现在,这里的大部分效率问题都归结为三件事:

  1. 单个表格可以比连接多个表格更快地扫描。
  2. 大行本身就有内存和磁盘空间成本。
  3. 如果单个表表示真正的1对多,那么它需要更多的插入,删除或更新工作。
  4. 第2点才真正进入,如果有很多情况需要一个特定的数据子集,而另一个需要另一个子集的情况,可能只需要几个你需要它们的地方。如果您在大多数地方使用大多数列,那么它不会为您带来任何好处。在这种情况下,拆分表是不好的。

    第1点和第3点分别争论和反对加入一个大表。

    在此之前,让我们回到“几乎所有”。如果有多个行包含一批空字段,为什么?经常回答“为什么?”揭示那里真的有一个自然的分裂,应该作为正常normalisation *的一部分分成另一个表。重复领域,是一个更大的建议,就是这种情况。

    首先这样做。

    对于非规范化 - 无论是通过分割自然的一个表,还是加入自然的几个 - 都是一种非常特殊的优化类型 - 它会使一些事情变得更有效,代价是使其他事情效率降低,并且它引入了可能性否则不存在的错误。我永远不会说你永远不应该反对 - 我自己做 - 但是你需要能够说“我正在以这种方式对表格X& Y进行非规范化,因为它会帮助C案件发生足够的事情我可以忍受案件D的额外费用“。然后你需要检查它实际上确实帮助案例C显着和案例D无关紧要,同时寻找隐藏的成本。

    首先归一化的原因之一是它在很多情况下都能提供良好的平均性能。这是你大多数时候想要的平衡。从一开始而不是以规范化数据库为起点进行非规范化几乎总是为时过早。

    *有趣的琐事:“正常化”的名称部分是对理查德尼克松的“越南化”政策的一种看法,这意味着在某些方面存在一个笑话,即将“-isation”添加到任何事物上。如果不是因为怀特豪斯对Tet攻势的反应,我们可能会使用gernund“正常化”或者完全不同的东西。

相关问题