Mysql 是否合并表以实现性能/集中化

Mysql 是否合并表以实现性能/集中化,mysql,database-design,innodb,Mysql,Database Design,Innodb,我一直在处理我的数据库,我突然想到,也许最好将我的两个表组合起来,以便更好地组织数据,并可能获得性能优势(或者没有?) 我有两个表,其中包含地址、交货和其他发票,它们的结构是相同的。一个表包含发票地址,另一个表包含交货 将这些合并到一个简单称为“addresses”的表中,并创建一个名为addressTypeId的新列,会有什么影响?此新列引用一个新表,该表包含地址类型,如交货、发票、住址等 由于不同类型的地址(交付和发票)的请求使用两个表,而不是一个表,这可能意味着请求地址数据时会出现延迟,因

我一直在处理我的数据库,我突然想到,也许最好将我的两个表组合起来,以便更好地组织数据,并可能获得性能优势(或者没有?)

我有两个表,其中包含地址、交货和其他发票,它们的结构是相同的。一个表包含发票地址,另一个表包含交货

将这些合并到一个简单称为“addresses”的表中,并创建一个名为addressTypeId的新列,会有什么影响?此新列引用一个新表,该表包含地址类型,如交货、发票、住址等

由于不同类型的地址(交付和发票)的请求使用两个表,而不是一个表,这可能意味着请求地址数据时会出现延迟,因此,让它们现在是如何分开的,对性能更好吗


顺便说一句,如果您只需要区分地址差异,我正在使用INNODB。

。我建议您需要在这个合并表中设置一个枚举列。如果存在,您可以添加一个新列,如下所示:

alter table add addressTypes枚举('delivery','invoice','home')默认为空

或者默认发票当您无法获得所需信息时,您认为应该默认的东西

不需要一次放置所有枚举值。正是您现在需要的,并在未来增加更多价值,如下所示


alter table change addressTypes addressTypes枚举('delivery','invoice','home','office')默认为空

如果缺少适当的索引,则查找性能将下降两倍(如果合并两个大小相同的表)。但是,如果缺少索引,则可能不关心性能。 使用散列索引的查找是固定时间。使用树索引的查找是对数的,因此效果很小。对树索引的写入也是对数的,对哈希映射的写入是摊销常数

不要遭受过早优化的痛苦

好的设计比最高性能更重要。地址查找可能不是您的瓶颈。由糟糕的数据库设计导致的糟糕代码远远超过任何好处。如果创建两个表,则将复制代码。代码复制是维护的噩梦

合并表。当您需要在不久的将来扩展应用程序时,您会心存感激。您可能希望创建更多的地址类型。您可能希望将通用功能添加到地址(格式化)。您的客户不会注意到遍历一个二叉树的多个级别所需的额外毫秒。他们会注意到您很难添加额外的功能,他们会注意到由于代码重复而导致的不一致

您甚至可以通过合并表来提高性能。虽然您可能需要遍历树中的一个额外节点,但该树更有可能缓存在内存中,而不需要磁盘访问。磁盘访问是昂贵的。您可以通过合并来减少磁盘访问


@BenP.p.Tung已经说过,枚举不需要额外的表。使用枚举类型。

一个表就可以了。如果存在性能问题,则将address type列添加到索引开头的主索引中。这将避免任何性能问题,直到您拥有非常多的地址

它们的结构是相同的

它们的约束也相同吗

  • 如果是,则合并地址
  • 如果没有,请将它们分开
约束与其字段一样是表的一部分

由于不同类型的地址(交付和发票)的请求使用两个表,而不是一个表,这可能意味着请求地址数据时会出现延迟,因此,让它们现在是如何分开的,对性能更好吗

您是否以相同的方式查询两种地址

  • 如果是的话,这两种方式都不重要(假设索引正确)
  • 如果没有,则不同的表使您能够对数据进行不同的索引
相关职位:



1例如,交货和发票是否都应该能够引用(通过外键)相同的地址?地址的PK应该对所有地址都是唯一的,还是只对特定类型的地址是唯一的?是否存在针对一种地址类型而不针对另一种地址类型的检查?等等等等。

重复编码是一个很好的观点,我将合并表:)