MySQL 5.7 不提供触发器执行次数的原生统计,因 INFORMATION_SCHEMA.TRIGGERS 和 SHOW TRIGGERS 仅返回元数据(如名称、事件、时机、定义语句),无计数字段;Performance Schema 可间接估算但非精确;最可靠方式是在触发器内通过原子写入计数表实现。

MySQL 5.7 原生不记录触发器执行次数,无法直接查“累计被触发多少次”。 它没有类似 information_schema.TRIGGERS 中的计数字段,也没有内置性能视图暴露该指标。想获得这个数据,必须靠外部手段间接推导或主动埋点。
为什么 SHOW TRIGGERS 和 INFORMATION_SCHEMA.TRIGGERS 都不返回执行次数
这两个来源只提供元数据:触发器名、绑定表、事件类型(INSERT/UPDATE/DELETE)、时机(BEFORE/AFTER)、定义语句(ACTION_STATEMENT)等。它们描述“有什么”,不记录“用了多少次”。INFORMATION_SCHEMA.TRIGGERS 里压根没有计数列;SHOW TRIGGERS 的 Statement 字段还被截断,更不可能藏统计逻辑。
替代方案:用 Performance Schema 监控触发器关联的 SQL 事件
虽然不能直接看到“t1_after_insert 被执行了 1287 次”,但你可以通过触发器所依赖的底层语句行为来估算。前提是已启用 Performance Schema 并开启相关 instrument:
- 确保
performance_schema已启用(默认 MySQL 5.7 开启) - 启用语句级监控:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('events_statements_history', 'events_statements_current'); - 启用对应事件 instrument:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'statement/sql/%';
- 然后查最近执行的语句中是否包含触发器里写的逻辑关键词,例如:
SELECT DIGEST_TEXT, COUNT_STAR FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT LIKE '%UPDATE audit_log%';
—— 这只能帮你确认“含 audit_log 的 UPDATE 语句执行了多少次”,前提是你的触发器体里有明确可识别的模式
注意:这种方式不是精确匹配触发器调用,而是靠语句特征反推,且只对近期有效(受 history 表大小和清理策略限制)。
最可靠的做法:在触发器内部加日志写入或计数表
如果你能修改触发器,这是唯一可控、可追溯的方式。例如,在触发器逻辑开头插入一条计数记录:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
INSERT INTO trigger_counter (trigger_name, invoked_at) VALUES ('emp_after_update', NOW());
或者用原子更新:
INSERT INTO trigger_counter (trigger_name, count) VALUES ('emp_after_update', 1) ON DUPLICATE KEY UPDATE count = count + 1;
要点包括:
- 目标表
trigger_counter必须提前建好,并设trigger_name为主键或唯一键 - 避免在高并发场景下用
SELECT + UPDATE,容易丢计数;优先用INSERT ... ON DUPLICATE KEY UPDATE或REPLACE - 如果触发器本身已有事务上下文,这条日志写入会参与回滚——这可能是你想要的(保证一致性),也可能不是(你想知道“哪怕事务失败也触发过”),需按需取舍
- 不要把日志写到同一张业务表上,否则可能引发递归触发(比如在
emp的AFTER UPDATE里又去UPDATE emp)
真正难的不是查一次,而是持续、准确、低开销地累积。一旦忘了加日志,历史次数就永远丢失;而依赖 Performance Schema 的方式,每次重启或清空 history 后就归零。所以别指望有个“开箱即用”的 SELECT trigger_invocation_count FROM ...——MySQL 5.7 就没这个字段。










