MySQL 历史触发器与应用程序插入

MySQL trigger vs application insert for history

我在 mysql 中有一个主要的 table 并且需要一个历史记录 table 来跟踪 table 中的变化。

我有两种方法。

  1. trigger --> 为主 table 创建一个触发器,它插入到历史 table 中,用于主 table 中的任何更改
  2. 从应用程序
  3. 插入或更新主table时插入历史table

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

假设您的触发器执行与单独的日志查询完全相同的操作(例如,只要您修改 table,两者都会向您的历史记录插入一行 table),两者之间没有显着的性能差异您的两个选择,因为两者的工作量相同。

决定通常是设计驱动的 - 或者是制定指南的人的偏好。

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

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

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

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