Mysql

如何從 MYSQL innodb 表中自動刪除 6 個月大的數據

  • January 25, 2019

我有一個非常大的表,我每天都在其中獲取數據,而且它的大小每天都在變大,但對於我的軟體來說,只有 6 個月的數據是有用的。所以,我打算刪除超過 6 個月的數據。我知道我可以使用 CRON 作業來做到這一點,但我想使用 MYSQL 方式自動刪除舊數據。我PARTITION也讀過,我的問題是我可以使用它PARTITION還是我必須找到一些替代方法?

事件調度器允許根據時間表執行正常事件。我在 Stack Overflow 上的文章中有詳細範例,您只需將時間間隔值從 24 小時更改為 6 個月。

首先,確保啟用了事件調度程序。要啟用它,請使用

SET GLOBAL event_scheduler = ON;

之後,您可以創建將檢查行創建時間並刪除舊記錄的事件。例如

CREATE EVENT cleaning ON SCHEDULE EVERY 1 MONTH ENABLE
 DO 
 DELETE FROM MyTable
 WHERE `timestamp_column` < CURRENT_TIMESTAMP - INTERVAL 6 MONTH;

如果表中沒有包含行創建時間戳的列,則可以創建觸發器,將目前時間戳和插入的行標識符插入輔助表。

CREATE TRIGGER logCreator AFTER INSERT ON MainTable
 FOR EACH ROW 
 INSERT INTO LogTable (MainID, Created) 
 VALUES(NEW.id, CURRENT_TIMESTAMP);

然後您可以使用此日誌獲取在特定時間之前創建的主表行的鍵並刪除相應的記錄。

delimiter |
CREATE EVENT cleaning ON SCHEDULE EVERY 1 MONTH ENABLE
 DO
 BEGIN
   DECLARE MaxTime TIMESTAMP;
   SET MaxTime = CURRENT_TIMESTAMP - INTERVAL 6 MONTH;
   DELETE FROM MainTable
   WHERE id IN (SELECT MainID FROM LogTable WHERE Created < MaxTime);
   DELETE FROM LogTable
   WHERE LogTable.Created < MaxTime;
 END |
delimiter ;

PARTITION BY RANGE(TO_DAYS(...)); 按週劃分。然後每周安排一次 cron 任務以減少一周並建立一個新的空分區。 詳情

請務必在建構分區時調整索引。任何唯一鍵或主鍵都必須包含分區鍵,並且通常應在末尾添加。

提供主要內容SELECTsSHOW CREATE TABLE如果您想進一步批評。

顯示了替代方案,例如遍歷PRIMARY KEY值、分塊刪除。 PARTITIONing是最好的,如果它適用的話。

引用自:https://dba.stackexchange.com/questions/148308