【发布时间】:2015-12-02 16:50:30
【问题描述】:
我有一个非常大的数据库。一列是时间戳,每天我都想删除 30 天或更早的任何行。问题在于,随着时间的推移,数据库删除行并插入新行,新行可能会插入到先前被删除行占用的位置,从而相对于时间戳创建碎片数据库。当我去清理数据库的时候,一个碎片化的数据库需要很长时间来清理,因为 MySQL 必须要遍历整个数据库。
我想采用的一种解决方案是为每一天创建单独的分区甚至单独的数据库,以便每天自动创建一个新的分区来填充,并且自动删除每 30 天以上的旧分区。
我正在研究PARTITION 命令,它似乎可以追溯分区表。我想从头开始自动完成。
有没有人知道如何做到这一点?
编辑: 我正在使用 snort 和 barnyard 来清理数据库。我在 cronjob 中一直在做一些类似的事情:
use YOUR-SNORT-DB-NAME;
DELETE FROM event WHERE timestamp < DATE_SUB(NOW(),INTERVAL 28 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;
DELETE FROM acid_event USING acid_event LEFT OUTER JOIN event USING (sid,cid) WHERE event.sid IS NULL;
DELETE FROM ag USING acid_ag_alert AS ag LEFT OUTER JOIN event AS e ON ag.ag_sid=e.sid AND ag.ag_cid=e.cid WHERE e.sid IS NULL;
OPTIMIZE TABLE event, data, iphdr, icmphdr, tcphdr, udphdr, opt, acid_event, acid_ag_alert
如果数据库非常大,这似乎不切实际。它似乎也没有使用索引。
我不是数据库专家,所以我想知道如何修改架构或清理脚本以提高性能。
【问题讨论】:
-
如果您的列被索引,您应该不会看到任何性能影响。
-
是什么让你认为你有一个碎片化的数据库?
-
也许你应该看看分区有什么用dba.stackexchange.com/questions/6607/…
-
使用按日期分区 - 然后您可以轻松地删除旧数据的分区,这是即时操作。
标签: mysql database partitioning