将非活动行移动到另一个表?

时间:2011-08-19 00:08:07

标签: mysql database database-design

我有一个表格,当创建一行时,它将在24小时内激活一些写入和大量读取。然后它在24小时后变为非活动状态,并且不再有写入,只有一些读取,如果有的话。

将这些行保留在表中还是将它们变为非活动状态(或通过批处理作业)移动到单独的表中是否更好?考虑到绩效。

4 个答案:

答案 0 :(得分:3)

这在很大程度上取决于你的表有多大,但如果它永远增长,并且每天有大量的行,那么很有可能将旧数据移动到另一个表是个好主意。有几种不同的方法可以实现这一点,哪种方法最好取决于您的应用程序和数据访问模式。

  1. 基本上如你所说,当一行变为“旧”时,INSERT到存档表,并从当前表中删除。

  2. 每天创建一个新表(或者每周或每个月创建一个新表,具体取决于数据集的大小),从不担心移动旧行。您只需在访问旧数据时查询旧表,但是对于当天,您只能访问当前表。

  3. 拥有“今天”表格和“所有时间”表格。复制两个表中的“今天”行,使它们与触发器或其他机制保持同步。当一行变旧时,只需从“今天”表中删除,留下“所有时间”行。

  4. #2的一个优势,可能不是很明显,我相信MySQL索引可以针对只读表进行优化。因此,通过使用永远不会写入的旧表,您可以利用这种额外的优化。

答案 1 :(得分:3)

通常不需要在适当的RDBMS中在表之间移动行。

我不熟悉mysql的细节,但你应该对以下内容做得很好:

  • 确保您的时间戳列已编入索引
  • 此外,您可以使用active BOOLEAN default true
    • 每天批量运行以标记> 24小时不活动行
    • 对timestamp列使用部分索引,以便只将标记为active的行编入索引
    • 请记住在您的where条件中使用timestamp和active = TRUE来命中索引。使用EXPLAIN很多。

答案 2 :(得分:1)

这一切都取决于编程的简易性和性能之间的平衡。性能明智,是肯定会更快。但是,速度增加是否值得努力很难说。

我已经研究过数百万行完美运行的系统。但是,如果数据不断增长,最终会成为一个问题。

我参与了一个存储自动化设备事务记录的数据库。它每天产生数十万个事件。一年后,查询不再以可接受的速度运行。我们现在在主表中保留上个月的日志(仍然有数百万行),并将旧数据移动到归档表。

应用程序的所有功能都没有在归档表中查找(如果您查询事务日志,它将不会返回任何结果)。它仅用于紧急用途,只需使用任何独立的数据库查询工具进行查询。因为存档有超过一亿行,并且这种紧急使用的性质通常是无法计划的(因此大部分是未编入索引的)查询,它们可能需要很长时间才能运行。

答案 3 :(得分:0)

还有另一种解决方案。使另一个表只包含活动记录(tblactiverecords)。当活动记录的数量非常小时,您可以只进行内部联接并获取活动记录。这应该花费很少的时间,因为默认情况下主键在mysql中编入索引。当您的行变为非活动状态时,您可以从tblactiverecords表中删除它们。

create table tblrecords (id int primary key, data text);

然后,

create table tblactiverecords (tblrecords_id primary key);

你可以做到

select data from tblrecords join tblactiverecords on tblrecords.id = tblactiverecords.tblrecords_id;

获取所有活动数据。