当前位置:  开发笔记 > 后端 > 正文

MySQL - 多个表上的大DELETE

如何解决《MySQL-多个表上的大DELETE》经验,为你挑选了0个好方法。

我有7个相关的表,在其中一个表上,有一个时间戳列,我想删除超过30天的所有行.但是,这些都是非常大的删除.我说的是数以千万计的记录.如果我从主表中删除所有这些记录,我必须查看其他6个表并从这些表中删除相关记录.

我的问题是优化这个的最佳方法是什么?

我正在考虑使用PARTITION但只有一个表有时间戳列.我担心如果我删除主表中的旧分区,相关记录仍将存在于其他6个表中.相关记录通过字段(sid,cid)相关联.

对于上下文我使用的是snort和barnyard,它们是IDS处理器.

我正在使用MySQL 5.1.73,MyISAM表

以下是清理日志的片段:

StartTime,EndTime,TimeElapsed,AffectedRows
Wed Jan 6 01:00:01 EST 2016,Wed Jan 6 01:45:11 EST 2016,45:10,2911807
Thu Jan 7 01:00:02 EST 2016,Thu Jan 7 01:25:29 EST 2016,25:27,2230255
Fri Jan 8 01:00:01 EST 2016,Fri Jan 8 01:24:18 EST 2016,24:17,1400470
Sat Jan 9 01:00:02 EST 2016,Sat Jan 9 05:47:10 EST 2016,287:8,23360088
Sun Jan 10 01:00:01 EST 2016,Sun Jan 10 10:06:16 EST 2016,546:15,44970072
Mon Jan 11 01:00:01 EST 2016,Mon Jan 11 09:40:39 EST 2016,520:38,43948091

这是我原来的清理脚本:

/usr/bin/mysql --defaults-extra-file=/old/.my.cnf snort_db >> /root/snortcleaner.log 2>&1 <

这是我目前的清理脚本:

DELETE FROM event WHERE timestamp BETWEEN DATE_SUB('${OLDEST_TIMESTAMP}', INTERVAL 1 HOUR) AND DATE_SUB(NOW(), INTERVAL 31 DAY);

DELETE FROM data USING data LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM iphdr USING iphdr LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM icmphdr USING icmphdr LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM tcphdr USING tcphdr LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM udphdr USING udphdr LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM opt USING opt LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;

我在两者之间来回切换,因为我不知道哪个更快,但现实是两者都太慢了.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有