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

Mysql 是否将非活动行移动到另一个表?,mysql,database,database-design,Mysql,Database,Database Design,我有一个表,当一行被创建时,它将在24小时内处于活动状态,有一些写入和大量读取。然后,它在24小时后变为非活动状态,不再进行写入,只有一些读取(如果有的话) 将这些行保留在表中还是在它们变为非活动(或通过批处理作业)时将它们移动到单独的表中更好?从性能的角度考虑。这在很大程度上取决于表的大小,但如果它永远增长,并且每天有大量行,那么将旧数据移动到另一个表将是一个好主意。有几种不同的方法可以实现这一点,哪种方法最好取决于您的应用程序和数据访问模式 基本上如您所说,当一行变为“旧”时,插入到存档表,

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


将这些行保留在表中还是在它们变为非活动(或通过批处理作业)时将它们移动到单独的表中更好?从性能的角度考虑。

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

  • 基本上如您所说,当一行变为“旧”时,插入到存档表,然后从当前表中删除

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

  • 有一张“今天”桌和一张“所有时间”桌。复制两个表中的“今天”行,使它们与触发器或其他机制保持同步。当一行变旧时,只需从“today”表中删除,保留“all time”行即可


  • #2的一个优点可能不是很明显,那就是我相信MySQL索引可以针对只读表进行优化。因此,通过使用从未写入的旧表,您可以利用这种额外的优化。

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

    我不熟悉mysql的细节,但您应该对以下方面做得很好:

    • 确保时间戳列已编制索引
    • 此外,还可以使用
      活动布尔默认值true
      • 每天进行批处理运行,以标记>24小时旧行处于非活动状态
      • 对时间戳列使用部分索引,以便仅对标记为活动的行进行索引
      • 记住在where条件中使用timestamp和active=TRUE来命中索引。使用解释很多

    这一切都取决于编程的简单性和性能之间的平衡。性能方面,是的,它肯定会更快。但速度的提高是否值得付出努力还很难说

    我工作过的系统运行得非常好,有数百万行。然而,如果数据不断增长,它最终会成为一个问题

    我为自动化设备开发了一个存储事务日志的数据库。它每天产生数十万个事件。一年后,这些查询将无法以可接受的速度运行。现在,我们将上个月的日志保存在主表中(仍有数百万行),并将较旧的数据移动到存档表中


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

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

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

    你能行

    select data from tblrecords join tblactiverecords on tblrecords.id = tblactiverecords.tblrecords_id;
    
    获取所有活动的数据

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