2011-08-19 29 views
3

我有一个表格,当一行被创建时,它会被激活24小时,有一些写入和大量的读取。然后它在24小时后变为非活动状态,并且不会有更多的写入,只有一些读取(如果有的话)。将不活动的行移动到另一个表中?

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

回答

3

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

  1. 从本质上讲,当一个行将成为“老”,插入到存档表,并从当前表中删除。

  2. 每天(或者每周或每个月,根据数据集的大小而定)创建一个新表,并且不用担心移动旧行。访问旧数据时只需查询旧表,但在当前,您只能访问当前表。

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

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

3

通常,在正确的RDBMS中的表之间移动行通常不是必需的。

我不熟悉mysql的细节,但你应该做的罚款下列要求:

  • 确保您的时间戳列索引
  • 此外,还可以使用active BOOLEAN default true
    • 每天批量运行以标记> 24小时旧行无效
    • 使用时间戳列的部分索引,以便只标记有效的行被索引
    • 请记住在您的条件下创建时间戳和活动= TRUE命中索引。大量使用EXPLAIN。
1

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

我已经在使用数百万行完美运行的系统上工作过。但是,如果数据不断增长,它最终会成为一个问题。

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

应用程序的任何功能都不会在归档表中查找(如果您执行事务日志的查询,它将不会返回任何结果)。它只能用于紧急情况,并且只能查询任何独立的数据库查询工具。由于档案有超过一亿行,而且这种紧急用途的性质通常是无法解决的(因此大多数是未索引的)查询,所以它们可能需要很长时间才能运行。

0

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

然后,

create table tblactiverecords (tblrecords_id primary key); 

你可以做

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

获得是活跃的所有数据。

相关问题