在另一个表中复制数据以提高性能

时间:2018-10-29 22:00:12

标签: mysql sql database select database-design

我目前正在为我正在构建的产品设计数据库体系结构。在开始在MySQL中创建所有内容之前,我只是在Excel文件中绘制所有内容。

当前,我有两个几乎完全相同的表。

TABLE A,其中包含每个用户每个数据点的最新值。

TABLE B包含每个用户每个数据点的每日记录。

我创建TABLE A而不是或仅依靠TABLE B的理由是,TABLE B中的行数每天都会随着我拥有的客户数而增长。例如,假设我有20,000个客户,TABLE B每天将增加20,000行。因此,通过创建TABLE A,我将只需要搜索20,000条记录来为每个用户找到每个数据点的最新值,因为我每天都会更新这些值;而对于TABLE B,我将不得不搜索数量不断增长的行,以获取每个用户的最新插入内容。

这是可接受的还是好的做法?

还是我应该忘记TABLE A来减少数据库中的“膨胀”?

2 个答案:

答案 0 :(得分:1)

这不是正确的方法。您基本上有两个合理的选择:

  1. 使用历史记录表上的索引来访问最近一天的记录。
  2. 使用表分区将每天存储在单独的分区中。

可以管理两个表,但这很麻烦,并且有内置方法可以处理这种情况。

答案 1 :(得分:0)

在我既需要“当前”数据又需要“历史记录”的情况下,这就是我要做的事情-一张带有当前数据的表和一张带有历史的表。对于不同的用法,它们的索引可能会有所不同,等等。

我会仔细考虑一下“历史”和“当前”之间的区别,然后使表不同而不相同

当有新记录(或您的情况下为2万行)出现时,我至少会将其放入Current中。我还可以将其写入History,从而使其完整(以少量冗余为代价)。或者,当下一行进入History时,我可以将行移至Current

除非我打算清除“旧”数据,否则我认为不需要PARTITIONing。在这种情况下,我将使用PARTITION BY RANGE(TO_DAYS(..))并选择每周/每月/不限分区数,以使分区数不超过约50。(如果选择“ daily”,History将在几秒钟后变慢几个月,只是因为分区。)

每天2万行-自昨天以来,其中许多行是否保持不变?那可能不是做事的正确方法。请详细说明每天发生的情况。您应该避免在History中重复行(日期除外)。