Mysql 使用两个表或一个包含大量字段的表更有效

Mysql 使用两个表或一个包含大量字段的表更有效,mysql,performance,database-table,Mysql,Performance,Database Table,相关但不完全相同的事情:(或者至少通读它对我没有任何帮助) 所以我正在开发一个新的网站(销售保险单),我们已经有几个网站(它是rails应用程序)可以这样做,所以我的sql数据库中有一个名为Policys的表。 可以想象,它有很多列来支持所有不同的可用选项 在这个新网站上工作时,我意识到我需要跟踪20多个选项 我担心的是,policies表已经很大了,但是现在它中的列几乎都被我们所有的应用程序使用。然而,如果我添加这些,它们将只用于新站点,并将在所有其他策略上留下大量空单元格 所以我的问题是,我

相关但不完全相同的事情:(或者至少通读它对我没有任何帮助)

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

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

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

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

“[A]l几乎全部使用”表明,你可以在考虑后更自然地拆分它

现在,这里的效率问题主要归结为三件事:

  • 单个表的扫描速度比跨多个表的连接速度更快
  • 大行本身有内存和磁盘空间成本
  • 如果一个表表示的内容实际上是一对多,那么它需要在insert、delete或update上做更多的工作
  • 第2点只有在很多情况下,您需要一个特定的数据子集,而在另一批情况下,您需要另一个子集,也许只有少数情况下您需要所有数据子集时,才真正起作用。如果您在大多数地方使用了大多数列,那么它不会给您带来任何好处。在这种情况下,拆分表是不好的

    第1点和第3点分别支持和反对加入一个大表

    在这之前,让我们回到“几乎所有”。如果有几行包含一批空字段,为什么?经常回答“为什么?”会揭示出这是一种自然的分裂,应该作为正常的一部分分解成另一张桌子*。字段的重复,更能说明情况就是这样

    先做这个

    去规范化——无论是通过拆分自然形成的一个表,还是将自然形成的多个表合并——是一种非常特殊的优化类型——它使一些事情更高效,而另一些事情则效率更低,并且引入了其他方面不存在的错误的可能性。我永远不会说你不应该去规范化-我自己做-但你需要能够说“我正在以这种方式去规范化表X&Y,因为这将有助于案例C的发生,并且我可以承受案例D的额外成本”。然后,您需要检查它是否确实对案例C有显著的帮助,而对案例D没有显著的帮助,同时查找隐藏的成本

    首先,标准化的原因之一是,它在广泛的情况下提供了良好的平均性能。这是你大部分时间想要的平衡。从一开始就去规范化,而不是以规范化数据库作为起点,这几乎总是不成熟的


    *有趣的琐事事实:“正常化”这个名字在一定程度上是对理查德·尼克松的“越南化”政策的一种理解,这意味着在某些方面有一个关于在几乎任何事情上添加“-isation”的笑话。如果不是白宫对春节攻势的反应,我们可以使用gernund“normalising”或完全不同的东西来代替。

    请记住,一旦你有一个包含许多列的巨大表,在没有延长应用程序停机时间的情况下,几乎不可能对其进行更改,例如添加或删除列。即使检索时间会受到负面影响,键/值结构也会使更改变得更容易。感谢您的全面回答。在仔细阅读了你的答案并与其他人交谈后,我决定最好的办法是继续做一张新桌子。虽然我不喜欢做大量联接的想法,但一个表中没有60-70列的总体好处是,其中很多列都是空的,超过了进行联接的成本。“很多列都是空的”?现在我更确定你想要不止一张桌子;这听起来像一张讨厌的大桌子,不应该是这样的东西。您是否熟悉与之相关的规范化主题?