mysql5.7 定时删除表数据

在 MySQL 5.7 中,你可以使用 Event Scheduler(事件调度器) 来实现这个需求。

以下是完整的步骤和 SQL 代码,分为三个部分:开启调度器 、创建定时任务 、验证与维护。

🛠️ 第一步:开启事件调度器

默认情况下,MySQL 的事件调度器可能是关闭的。你需要先检查并开启它。

  1. 检查状态:

    sql 复制代码
    SHOW VARIABLES LIKE 'event_scheduler';

    如果 Value 显示为 OFF,请执行下一步。

  2. 开启调度器(临时生效,重启失效):

    sql 复制代码
    SET GLOBAL event_scheduler = ON;

    注意 :如果需要永久生效(重启后依然有效),需要在 MySQL 的配置文件(my.ini 或 my.cnf)的 [mysqld] 部分添加 event_scheduler=ON,然后重启 MySQL 服务。

📝 第二步:创建定时删除任务

我们将创建一个名为 evt_cleanup_invalid_devices 的事件,每分钟执行一次删除操作。

sql 复制代码
DELIMITER $$

CREATE EVENT IF NOT EXISTS evt_cleanup_invalid_devices
ON SCHEDULE EVERY 1 MINUTE
STARTS NOW() -- 立即开始
ON COMPLETION PRESERVE -- 任务持久化,不会因为重启或时间到了就自动删除事件定义
ENABLE
DO
BEGIN
    -- 执行删除操作
    DELETE FROM device WHERE LENGTH(deviceId) != 20;
    
    -- 可选:如果你想记录日志,可以在这里添加插入日志表的语句
    -- INSERT INTO cleanup_log (run_time, rows_affected) VALUES (NOW(), ROW_COUNT());
END$$

DELIMITER ;

代码解释:

  • ON SCHEDULE EVERY 1 MINUTE:设置频率为每分钟一次。
  • STARTS NOW():从当前时间开始执行。
  • ON COMPLETION PRESERVE:这是一个好习惯,表示事件执行后保留定义,否则 MySQL 可能会在特定条件下丢弃事件定义。
  • BEGIN ... END:使用代码块包裹,方便以后扩展(比如添加日志记录)。

🔍 第三步:验证与管理

创建完成后,你可以通过以下方式查看和管理这个定时器:

  1. 查看所有事件:

    sql 复制代码
    SHOW EVENTS;

    查看 Status 是否为 ENABLED,Interval 是否为 1 MINUTE。

  2. 查看事件详细信息:

    sql 复制代码
    SELECT * FROM information_schema.EVENTS WHERE EVENT_NAME = 'evt_cleanup_invalid_devices'\G
  3. 手动管理(暂停/恢复/删除):

    • 暂停任务: ALTER EVENT evt_cleanup_invalid_devices DISABLE;
    • 恢复任务: ALTER EVENT evt_cleanup_invalid_devices ENABLE;
    • 删除任务: DROP EVENT IF EXISTS evt_cleanup_invalid_devices;

💡 性能优化建议

如果你的 device 表数据量非常大(例如百万级以上),每分钟全表扫描 LENGTH(deviceId) != 20 可能会比较慢。

为了提升性能,建议给 deviceId 字段加上索引 ,或者利用生成列(Generated Column)来优化查询(但在 MySQL 5.7 中,直接对函数结果建索引有限制,通常建议直接确保 deviceId 字段本身有索引,或者在业务层保证数据质量)。

如果数据量极大,建议使用 LIMIT 分批删除,避免锁表时间过长:

sql 复制代码
-- 高级版:分批删除(避免一次删除太多导致锁表)
DELETE FROM device WHERE LENGTH(deviceId) != 20 LIMIT 1000;

(注:如果数据量特别大,可能需要配合循环逻辑,但在简单的 Event 中,上述单条语句通常足够应对中等规模数据)。

相关推荐
IT19957 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
paopaokaka_luck10 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
lzhdim11 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
这个DBA有点耶14 小时前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
程序员塔塔喵14 小时前
【MySQL篇|第三篇】脏读,幻读,不可重复读
数据库·mysql·不可重复读·幻读·脏读
这个DBA有点耶15 小时前
备份成功≠数据可恢复:静默损坏会让物理备份把坏页一起带走
数据库·mysql·代码规范
数据库小学妹15 小时前
MySQL MDL锁等待排查:DDL卡住与长事务定位
数据库·后端·mysql
lhdz_bj16 小时前
Mysql Server配置详解
mysql·配置·file·config·1024程序员节·option·选项
syagain_zsx19 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
时间售卖铺19 小时前
MySQL 备份
运维·数据库·mysql·云原生