Mysql
如何從 MYSQL innodb 表中自動刪除 6 個月大的數據
我有一個非常大的表,我每天都在其中獲取數據,而且它的大小每天都在變大,但對於我的軟體來說,只有 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 任務以減少一周並建立一個新的空分區。 詳情。請務必在建構分區時調整索引。任何唯一鍵或主鍵都必須包含分區鍵,並且通常應在末尾添加。
提供主要內容
SELECTs
,SHOW CREATE TABLE
如果您想進一步批評。這顯示了替代方案,例如遍歷
PRIMARY KEY
值、分塊刪除。PARTITIONing
是最好的,如果它適用的話。