在将表分解为多个表之前,应该有多大的MySQL表?

时间:2015-10-10 16:32:25

标签: mysql performance

问题:我们有一张非常大的桌子,而且还在增长。它的大多数条目(比如说80%)都是历史数据(“DATE”字段超过当前日期)很少被查询,而其中的一小部分(比如说20%)是当前数据(当前日期之后的“DATE”字段),大多数查询搜索这些当前条目。

考虑两种可能的情况,哪种情况会更好(考虑整体实施难度和性能,......)

  1. 将大表分成两个表:历史数据和当前数据。并且每天我将具有过期日期的记录从当前表移动到历史表。

  2. 将记录保存在一个表中(DATA字段定义为INDEXED)。

  3. 方案A表示实施和维护更加喧嚣,并且每日基数超载以在表之间移动日期,而方案B表示搜索大型数据库(虽然已编入索引)。它会造成记忆问题吗?建议使用哪种方案?还有其他建议吗?

3 个答案:

答案 0 :(得分:4)

您通常不希望将大表分成多个表,尽管拥有当前和历史表是完全合理的。你的过程是有道理的。然后,您可以针对查询需求优化当前表。我可能会选择两个表(假设您提供的信息有限),因为它允许这样的优化。

但是,请勿拆分历史数据。相反,使用分区。请参阅documentation。一个警告:查询需要在where子句中指定分区键以利用分区。无论如何,这是典型的大桌子。

答案 1 :(得分:2)

问题:系统功能所需的历史数据还是存储这些记录用于其他目的(例如审核)?可能是时候通过将历史数据移动到存档来清理房屋了。

答案 2 :(得分:2)

根据我的经验,大多数拥有大数据的系统都有历史表。在大多数情况下,我当前的数据和历史数据都有不同的用户组。前端用户使用当前数据来处理客户当前或最近的交易。历史数据通常由不必直接与客户/客户交谈的用户组使用。

不要担心实施和维护的问题,因为我认为您的主要考虑因素都是关于性能的。在您将生产的程序移动后,实施只是一次性交易,将以指定的频率(如每周,每月或每年的档案)运行。维护非常小,一旦实施就可以忘记它。您只需要确保彻底测试程序。

对于规范化的历史表,表具有相同的结构和字段名称,这使得数据复制更加容易。这样,就可以在表之间进行表连接。

如果您选择不拆分数据,则将继续在索引后添加索引。但是在某个地方,你仍会遇到同样的问题。