首页 > 解决方案 > MySQL触发器与应用程序插入历史

问题描述

我在 mysql 中有一个主表,需要一个历史表来跟踪表中的更改。

我有两种方法。

  1. 触发器--> 为主表创建一个触发器,该触发器插入到历史表中,以便主表中的任何更改
  2. 从应用程序插入或更新主表时插入历史表

我正在检查哪种方法是性能最佳的方法。

标签: mysqlspring-jdbc

解决方案


假设您的触发器执行与单独的日志查询完全相同的操作(例如,当您修改表时,两者都在历史表中插入一行),您的两个选项之间没有显着的性能差异,因为两者所做的工作量相同。

该决定通常是设计驱动的 - 或者是制定您必须遵循的指导方针的人的偏好。

为您的历史日志使用触发器的一些优点:

  • 您不能忘记记录,例如通过在您的应用程序中编码错误,并且不必在每个快速而肮脏的维护脚本中处理它。MySQL 为您完成。
  • 您可以直接访问触发器中的所有列值,包括它们以前的值,特别是主键 ( new.id)。这使得日志记录变得微不足道。
  • 例如,如果您进行批量修改,编写单独的日志查询可能会很复杂。delete from tablename where xyz? 你可能会做insert into historytable ... select ... where xyz第一个,如果 xyz 是一个缓慢的情况,最终不会删除任何东西,你可能只是用这种方式加倍你的执行时间。这么多的性能。update tablename set a = rand() where a > 0.5? 祝你好运为此编写一个适当的单独的日志查询。

不使用触发器记录的一些优点:

  • 您可以控制记录的时间和内容,例如,如果您只想记录最终用户在您的应用程序中所做的特定更改,而不是那些通过批处理脚本或自动进程完成的更改,那么明确记录什么可能会更容易(也更快)你想登录。
  • 您可能想要记录触发器不可用的附加信息(并且您不想存储在主表中),例如 Windows 登录或用户按下以访问修改此数据的功能的最后一个按钮。
  • 用编程语言编写通用日志记录函数可能更方便,您可以在其中使用元数据动态生成日志记录查询或在所有列的循环中比较旧值和新值,而不是为每个表维护 3 个触发器,您通常必须明确列出每一列。
  • 因为您对性能特别感兴趣:虽然它可能更多的是理论而不是实际优势,但如果您进行大量批量修改,批量写入日志也可能更快(例如,一次插入 1000 条历史记录行会更快而不是使用触发器单独插入 1000 行)。但是您必须正确设计日志查询,并且查询本身不会很慢。

推荐阅读