【发布时间】:2013-03-03 14:41:29
【问题描述】:
在使用 InnboDB & MySQL 时,我将大表拆分为多个小表,有优势还是劣势? 当然,我不是在谈论拆分实际的 innoDB 文件,我只是想知道当我使用多个表时会发生什么。
情况: 我有一个包含数百万行(项目)的真正大表,它们被分类(列“类别”)。 现在,我正在考虑为每个类别使用单独的表格。 在任何情况下,我都不需要跨多个表的数据。
【问题讨论】:
在使用 InnboDB & MySQL 时,我将大表拆分为多个小表,有优势还是劣势? 当然,我不是在谈论拆分实际的 innoDB 文件,我只是想知道当我使用多个表时会发生什么。
情况: 我有一个包含数百万行(项目)的真正大表,它们被分类(列“类别”)。 现在,我正在考虑为每个类别使用单独的表格。 在任何情况下,我都不需要跨多个表的数据。
【问题讨论】:
一般来说,如果您的表格彼此没有关联,则它们应该位于单独的表格中,而不是一个包罗万象的表格。
但是,如果它们是相关的,它们实际上应该位于一个表中。您可以通过多种方式管理大型表的性能。我建议你看看partitioning the tables,如果它变得太大而开始引起问题。
但是,正如您所说,数百万行并不是一个“真正的大表”,我们有许多具有数千万行的表,甚至还有一些具有数亿行的表 - 由于混合了cleaver 索引、分区和读取副本。
编辑 1 - 响应 cmets:
在键值对中的每个键上创建动态表正如您所说的那样不寻常、丑陋且非常错误——您正在击败 RDBMS 的关系部分。 我无法具体说明以下内容,因为这个问题仍然缺乏您想要实现的架构和详细信息 - 但是我觉得我掌握的足够多,可以编辑我的原始答案。
关于在同一个数据库中对表进行分区和在另一个数据库中创建新表存在很大的不同。您询问性能,一般来说,它们应该执行相同的操作(即 1000gb 数据库中的一个新表和 0gb 数据库中的一个新表),前提是您有足够的资源,例如用于索引的内存和底层数据存储上的 IO,并且没有瓶颈。
我真的不明白您为什么要创建动态表 (“table_{category}”),或将值/类别存储在文本文件中。这听起来确实需要 1-N 关系和 JOIN。
【讨论】: