【问题标题】:Using multiple Tables instead of one BIG table?使用多个表而不是一个大表?
【发布时间】:2013-03-03 14:41:29
【问题描述】:

在使用 InnboDB & MySQL 时,我将大表拆分为多个小表,有优势还是劣势? 当然,我不是在谈论拆分实际的 innoDB 文件,我只是想知道当我使用多个表时会发生什么。

情况: 我有一个包含数百万行(项目)的真正大表,它们被分类(列“类别”)。 现在,我正在考虑为每个类别使用单独的表格。 在任何情况下,我都不需要跨多个表的数据。

【问题讨论】:

标签: mysql database innodb


【解决方案1】:

一般来说,如果您的表格彼此没有关联,则它们应该位于单独的表格中,而不是一个包罗万象的表格。

但是,如果它们是相关的,它们实际上应该位于一个表中。您可以通过多种方式管理大型表的性能。我建议你看看partitioning the tables,如果它变得太大而开始引起问题。

但是,正如您所说,数百万行并不是一个“真正的大表”,我们有许多具有数千万行的表,甚至还有一些具有数亿行的表 - 由于混合了cleaver 索引、分区和读取副本。

编辑 1 - 响应 cmets:

在键值对中的每个键上创建动态表正如您所说的那样不寻常、丑陋且非常错误——您正在击败 RDBMS 的关系部分。 我无法具体说明以下内容,因为这个问题仍然缺乏您想要实现的架构和详细信息 - 但是我觉得我掌握的足够多,可以编辑我的原始答案。

关于在同一个数据库中对表进行分区和在另一个数据库中创建新表存在很大的不同。您询问性能,一般来说,它们应该执行相同的操作(即 1000gb 数据库中的一个新表和 0gb 数据库中的一个新表),前提是您有足够的资源,例如用于索引的内存和底层数据存储上的 IO,并且没有瓶颈。

我真的不明白您为什么要创建动态表 (“table_{category}”),或将值/类别存储在文本文件中。这听起来确实需要 1-N 关系和 JOIN。

【讨论】:

  • 感谢您的评论。我的例子并没有反映 1:1 的现实生活场景,我只是想打个比方。在我的 RL 场景中,创建单独的表需要创建 DYNAMIC 表,这看起来不常用且丑陋。我有一个包含“值”和“类别”两列的表。所以我正在考虑为每个“类别”创建一个新表,但我不知道这样做是否有任何好处(性能)。 . 将它全部保存在一个表中会更容易和更优雅,但由于数据不相关,我可以使用多个表而不会出现逻辑 pov 的问题。
  • @Benedik B 是键值对表吗?如果您提供更多信息,例如架构和您的目标,我也许可以扩展我的答案
  • 谢谢。我认为您可以将其称为键/值表(“值”和“类别”)。现在,我可以创建一个只有“value”列的动态表“table_{category}”,而不是“category”列。我什至在考虑使用文本文件而不是 MySQL。我会每隔几天(但很多)填写行,我每周会读几次表格(总是整张表格,而不是部分表格)。
  • 顺便说一句:假设我有一个 1000GB 的 innoDB 数据库。这个 1000GB 数据库中的新表会比新的 0GB innoDB 数据库中的新表慢吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多