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