【问题标题】:MySQL - Partitioning database or tables by dates for quick cleanupMySQL - 按日期对数据库或表进行分区以进行快速清理
【发布时间】: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


【解决方案1】:

是的,PARTITIONing 可用于从表中清除“旧”数据。这是PARTITIONing 的少数用途之一。并使用PARTITION BY RANGE(TO_DAYS(...)),而不是BY HASH 等。有关执行ALTERs 的详细信息和示例代码,请参阅[我的博客]。它建议有大约 32 个“每日”分区。

不要在 InnoDB 表上使用OPTIMIZE TABLE;几乎总是不值得付出努力。

您是否在所有表上都有一个复合 INDEX(sid,cid)

如果其他表上的 DELETEs 侵入性太强(因为锁很长),请参阅 delete blog 以了解侵入性较小的选项的讨论。

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2017-10-29
    • 2012-02-16
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2016-02-21
    • 2016-10-15
    相关资源
    最近更新 更多