【问题标题】:Archiving rows dynamically动态归档行
【发布时间】:2011-02-26 22:24:21
【问题描述】:

我想知道动态归档行的最佳解决方案是什么。例如,当用户将任务标记为已完成时,该任务需要存档但仍可访问。

实现这一目标的最佳做法是什么?我是否应该将它们全部放在同一张表中并从查询中忽略已完成的任务?恐怕随着时间的推移,表格会变得很大(一年或更少的 1,000,000 行)。或者我应该创建另一个表,即task_archive,并在需要数据时查询该行?

我知道之前有人问过类似的问题,但其中大多数是关于同时归档数千行的问题,我只需要知道在标记完成后一次归档 1 行的最佳方法(以及原因)是什么

【问题讨论】:

    标签: mysql archive


    【解决方案1】:

    为了速度和易用性,我通常会将行保留在同一个表中(并将其标记为已完成),然后将其移至存档表。这样,用户就不会因为当场做出该动作而耽误时间;移动可以在非忙碌期间作为批处理进行。

    何时该移动取决于您的应用程序。例如,如果他们有一个显示“最近完成的任务”的仪表板小部件,该小部件显示了过去一周完成的所有任务(并让他们深入查看详细信息),则将行移动到存档中可能是有意义的他们完成后的一周。或者,如果他们经常需要查看当前学期的任务(对于学术应用程序),但很少查看前学期的任务,请在学期末进行批量迁移。

    如果表被索引,1,000,000 行应该没什么大不了的,老实说。

    【讨论】:

    • 如果用户查看某个日期范围内的所有已完成任务(按创建日期排序)我将不得不使用UNION ALL 查询表,这不会使事情复杂化吗?这也会影响性能?
    • 是的。目标是在用户可能想要进行此类查询之后的某个时间点将内容移至存档;也许你的申请需要 5 年。这个想法是,经常进行的查询类型由常规任务表提供服务,而对存档的查询应该很少。甚至可能“档案”完全位于一个单独的系统中,例如数据仓库。
    • 我明白你的意思,完全有道理。出于统计目的,我仍然需要查询存档表,但如果我认为长期如此,那么这些查询应该像你说的那样很少见。谢谢!
    【解决方案2】:

    您可以使用触发器来捕获订单已标记为已完成,从当前表中删除,然后插入到存档表中。

    或者,您可以创建一个执行归档的存储过程。例如

    sp_markcompleted(taskid)

    开始交易;

    insert into newtable select * from oldtable where id=taskid;

    从 id=taskid 的旧表中删除;

    提交;

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2021-10-11
      • 2010-11-19
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多