日志表的数据会随着系统的使用,数据量不断增加,时间久了之后,会导致日志表查询很慢,甚至根本打不了了。
为了缓解日志表数据量大导致无法查询或查询慢的问题,有个解决方法是定期把日志表数据剪切到历史记录表中。
下面以系统的 api接口日志表为例,说明具体的操作方法。
有两张表,接口日志表、接口日志历史记录表。每天定时把日志表一个月前的日志信息删除,插入到日志历史记录表中。这样可以保证日志表数据量不会太大,同时还能保留原来的日志数据。
两个表的创表语句:
sql
CREATE TABLE `sys_interface_log` (
`log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID',
`interface_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '接口名称',
`interface_url` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '调用地址',
`request_body` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '请求参数',
`request_time` datetime DEFAULT NULL COMMENT '请求时间',
`response_body` longtext CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '返回参数',
`response_time` datetime DEFAULT NULL COMMENT '返回时间',
`call_status` int DEFAULT NULL COMMENT '接口调用状态(1:成功、0:失败)',
`fail_reason` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '失败原因',
`sms_notify` int DEFAULT NULL COMMENT '失败时通知发送情况(1:短信发送成功、0:短信发送失败)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`batch_id` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '批次ID',
`interface_system` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '接口对应的系统',
PRIMARY KEY (`log_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=377 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='接口日志表';
CREATE TABLE `sys_interface_log_history` (
`log_id` bigint DEFAULT NULL COMMENT '日志ID',
`interface_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '接口名称',
`interface_url` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '调用地址',
`request_body` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '请求参数',
`request_time` datetime DEFAULT NULL COMMENT '请求时间',
`response_body` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '返回参数',
`response_time` datetime DEFAULT NULL COMMENT '返回时间',
`call_status` int DEFAULT NULL COMMENT '接口调用状态(1:成功、0:失败)',
`fail_reason` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '失败原因',
`sms_notify` int DEFAULT NULL COMMENT '失败时通知发送情况(1:短信发送成功、0:短信发送失败)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`batch_id` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '批次ID',
`interface_system` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '接口对应的系统'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='接口日志表-历史数据表';
创建事件
sql
CREATE DEFINER=`root`@`%` EVENT `cleanup_interface_logs` ON SCHEDULE EVERY 1 DAY STARTS '2026-05-03 01:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN
-- 错误处理
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
-- 开始事务
START TRANSACTION;
-- 将1个月前的接口日志数据移动到历史表
INSERT INTO sys_interface_log_history (
log_id,
interface_name,
interface_url,
request_body,
request_time,
response_body,
response_time,
call_status,
fail_reason,
sms_notify,
create_time,
batch_id,
interface_system
)
SELECT
log_id,
interface_name,
interface_url,
request_body,
request_time,
response_body,
response_time,
call_status,
fail_reason,
sms_notify,
create_time,
batch_id,
interface_system
FROM sys_interface_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 删除已移动的数据
DELETE FROM sys_interface_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 将1个月前的发单接口日志数据移动到历史表
INSERT INTO sys_bill_detail_log_history (
log_id,
batch_id,
interface_system,
pay_play_id,
recore_content,
settle_status,
fail_reason,
sms_notify,
create_time
)
SELECT
log_id,
batch_id,
interface_system,
pay_play_id,
recore_content,
settle_status,
fail_reason,
sms_notify,
create_time
FROM sys_bill_detail_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 删除已移动的数据
DELETE FROM sys_bill_detail_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 提交事务
COMMIT;
END
创建一个名为cleanup_interface_logs的事件,从2026-05-03开始,每天凌晨一点执行。
需要开启事件调度器
-- 查看事件调度器状态 SHOW VARIABLES LIKE 'event_scheduler';
-- 开启事件调度器(若为OFF) SET GLOBAL event_scheduler = ON;
查看事件的状态
-- 查看事件是否启用 SHOW EVENTS LIKE 'cleanup_interface_logs';
通过navicat可以直接编辑事件,操作如下:

选中事件,然后点击 设计事件,就可以编辑了。

也可以通过navicat图形化界面创建事件。