导读:本期聚焦于小伙伴创作的《mysql触发器如何监控慢写入操作_通过记录执行耗时到诊断表》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《mysql触发器如何监控慢写入操作_通过记录执行耗时到诊断表》有用,将其分享出去将是对创作者最好的鼓励。

mysql触发器可以在数据写入操作执行的前后自动触发自定义逻辑,借助这个特性,我们可以记录写入操作的执行耗时,将慢写入的相关信息存储到诊断表中,实现轻量级的慢写入监控。

mysql触发器如何监控慢写入操作_通过记录执行耗时到诊断表

一、创建慢写入诊断表

首先需要创建一个用于存储慢写入记录的表,该表需要包含写入操作的基本信息、执行耗时、触发时间等字段,方便后续排查问题。

-- 创建慢写入诊断表
CREATE TABLE IF NOT EXISTS slow_write_diagnosis (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
    table_name VARCHAR(100) NOT NULL COMMENT '写入操作的表名',
    operation_type VARCHAR(20) NOT NULL COMMENT '操作类型:INSERT/UPDATE/DELETE',
    execute_time DECIMAL(10,3) NOT NULL COMMENT '执行耗时,单位毫秒',
    trigger_time DATETIME NOT NULL COMMENT '触发器触发时间',
    record_data TEXT COMMENT '写入的数据内容'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='慢写入诊断记录表';

二、实现慢写入监控触发器

我们可以通过BEFOREAFTER类型的触发器配合,计算写入操作的执行耗时,当耗时超过阈值时,将记录写入诊断表。

1. 创建BEFORE触发器记录开始时间

在写入操作执行前,将当前时间存储到用户变量中,作为耗时的起始时间。

-- 为测试表user_info创建INSERT前触发器
DELIMITER //
CREATE TRIGGER before_user_insert BEFORE INSERT ON user_info
FOR EACH ROW
BEGIN
    -- 设置用户变量存储操作开始时间,精确到微秒
    SET @write_start_time = NOW(6);
END //
DELIMITER ;

2. 创建AFTER触发器计算耗时并记录

写入操作执行完成后,再次获取当前时间,计算与起始时间的差值,若超过设定的慢写入阈值(比如100毫秒),则将记录插入诊断表。

-- 为测试表user_info创建INSERT后触发器
DELIMITER //
CREATE TRIGGER after_user_insert AFTER INSERT ON user_info
FOR EACH ROW
BEGIN
    DECLARE cost_time DECIMAL(10,3);
    DECLARE slow_threshold DECIMAL(10,3) DEFAULT 100.000; -- 慢写入阈值,单位毫秒
    -- 计算执行耗时,转换为毫秒
    SET cost_time = TIMESTAMPDIFF(MICROSECOND, @write_start_time, NOW(6)) / 1000;
    -- 如果耗时超过阈值,插入诊断表
    IF cost_time > slow_threshold THEN
        INSERT INTO slow_write_diagnosis (table_name, operation_type, execute_time, trigger_time, record_data)
        VALUES ('user_info', 'INSERT', cost_time, NOW(), CONCAT('id:', NEW.id, ',name:', NEW.name));
    END IF;
END //
DELIMITER ;

3. 更新和删除操作的触发器适配

对于UPDATE和DELETE操作,只需要调整触发器的触发时机和操作的表、记录的内容即可,核心的耗时计算逻辑一致。

-- UPDATE操作的BEFORE触发器
DELIMITER //
CREATE TRIGGER before_user_update BEFORE UPDATE ON user_info
FOR EACH ROW
BEGIN
    SET @write_start_time = NOW(6);
END //
DELIMITER ;

-- UPDATE操作的AFTER触发器
DELIMITER //
CREATE TRIGGER after_user_update AFTER UPDATE ON user_info
FOR EACH ROW
BEGIN
    DECLARE cost_time DECIMAL(10,3);
    DECLARE slow_threshold DECIMAL(10,3) DEFAULT 100.000;
    SET cost_time = TIMESTAMPDIFF(MICROSECOND, @write_start_time, NOW(6)) / 1000;
    IF cost_time > slow_threshold THEN
        INSERT INTO slow_write_diagnosis (table_name, operation_type, execute_time, trigger_time, record_data)
        VALUES ('user_info', 'UPDATE', cost_time, NOW(), CONCAT('id:', NEW.id, ',old_name:', OLD.name, ',new_name:', NEW.name));
    END IF;
END //
DELIMITER ;

三、方案注意事项

  • 触发器会增加写入操作的额外开销,建议只在需要监控的表上创建,不要全库开启。
  • 用户变量@write_start_time是会话级别的,不同连接的写入操作不会互相干扰,但在高并发场景下需要确认mysql的变量隔离机制符合预期。
  • 诊断表需要定期清理历史数据,避免占用过多存储空间,可以设置定时任务删除超过7天的记录。
  • 该方案只能记录单条写入操作的耗时,批量写入的场景下,触发器的执行次数会和批量条数一致,需要结合业务场景调整阈值。

四、慢写入记录查询示例

当需要排查慢写入问题时,可以直接查询诊断表获取相关信息。

-- 查询最近100条慢写入记录,按耗时降序排列
SELECT id, table_name, operation_type, execute_time, trigger_time, record_data
FROM slow_write_diagnosis
ORDER BY execute_time DESC
LIMIT 100;

mysql触发器慢写入监控执行耗时记录诊断表修改时间:2026-07-22 17:03:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。