1. 项目背景与核心需求
最近在维护一个用户行为日志系统时遇到了存储空间告急的问题。这个系统每天产生约200万条日志记录,按照这个增长速度,我们的SSD存储将在3个月内耗尽。更关键的是,业务部门反馈最近查询响应时间从原来的200ms飙升到了1.5s以上。
经过分析发现,这个日志表已经积累了超过2亿条历史数据,其中90%都是6个月前的旧数据。这些数据虽然偶尔需要用于审计回溯,但日常业务完全用不到。这就是典型的"数据热温冷分层"问题——我们需要将热数据保留在性能最好的存储中,而冷数据应该归档或清理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案选型
2.1 为什么选择事件调度器
MySQL 5.1开始引入的事件调度器(Event Scheduler)在8.0版本已经非常成熟。相比外部crontab方案,它有三大优势:
- 执行上下文在数据库内部,避免网络开销和连接建立消耗
- 权限体系与数据库用户体系一致,安全性更好
- 执行日志可以直接在performance_schema中查看
2.2 删除策略设计
我们设计了阶梯式删除策略:
sql复制-- 保留最近7天的完整数据
DELETE FROM user_logs WHERE create_time < DATE_SUB(NOW(), INTERVAL 7 DAY);
-- 保留30天内的每日快照(每天00:00的一条样本)
INSERT INTO log_archive
SELECT * FROM user_logs
WHERE create_time BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND DATE_SUB(NOW(), INTERVAL 7 DAY)
AND HOUR(create_time) = 0
ORDER BY create_time DESC
LIMIT 1 PER DAY;
-- 超过30天的数据直接删除
DELETE FROM user_logs WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
3. 完整实现步骤
3.1 启用事件调度器
首先确认MySQL配置:
sql复制SHOW VARIABLES LIKE 'event_s
