我有一个表格,当创建一行时,它将在24小时内激活一些写入和大量读取。然后它在24小时后变为非活动状态,并且不再有写入,只有一些读取,如果有的话。
将这些行保留在表中还是将它们变为非活动状态(或通过批处理作业)移动到单独的表中是否更好?考虑到绩效。
答案 0 :(得分:3)
这在很大程度上取决于你的表有多大,但如果它永远增长,并且每天有大量的行,那么很有可能将旧数据移动到另一个表是个好主意。有几种不同的方法可以实现这一点,哪种方法最好取决于您的应用程序和数据访问模式。
基本上如你所说,当一行变为“旧”时,INSERT到存档表,并从当前表中删除。
每天创建一个新表(或者每周或每个月创建一个新表,具体取决于数据集的大小),从不担心移动旧行。您只需在访问旧数据时查询旧表,但是对于当天,您只能访问当前表。
拥有“今天”表格和“所有时间”表格。复制两个表中的“今天”行,使它们与触发器或其他机制保持同步。当一行变旧时,只需从“今天”表中删除,留下“所有时间”行。
#2的一个优势,可能不是很明显,我相信MySQL索引可以针对只读表进行优化。因此,通过使用永远不会写入的旧表,您可以利用这种额外的优化。
答案 1 :(得分:3)
通常不需要在适当的RDBMS中在表之间移动行。
我不熟悉mysql的细节,但你应该对以下内容做得很好:
active BOOLEAN default true
列
答案 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;
获取所有活动数据。