Mysql
大量刪除後的 AWS RDS 後期優化
我正在使用 AWS RDS MySQL。所有表都在
InnoDB
並啟用innoDB_file_per_table
。我的一個日誌表增長太快了。我想刪除超過 1 週的數據。甚至1 週的數據是 120GB。每個週末,該作業都會執行並刪除舊數據。
我想回收磁碟空間並更新統計資訊。
OPTIMIZE
餐桌對我們來說真的很痛苦。刪除大量記錄後我應該執行哪些優化?
PARTITION BY RANGE(TO_DAYS(date))
並有每日分區。每天晚上DROP PARTITION
將一周舊的分區和REORGANIZE
通常空的“未來”分區變成明天和一個新的“未來”。這使得刪除基本上是免費和即時的。並將磁碟空間減少到不超過一周的數據量。
更多細節。
(不需要觸發器,不需要表輪換。查詢可以在
PARTITIONed
表上透明地工作。可能需要對索引進行一些更改。)
您可以嘗試以下選項。
- 將分區與 DateRange 一起使用
- 創建具有日期範圍的表,每個分區包含每週數據。
- 要考慮的事情是選擇和更新,這意味著您應該使用分區名稱來指定除 PK 之外的任何位置條件。這意味著必須更改程式碼。
- 有一份工作:
alter table drop partition 1WEEKAGO_PARTITION_PARTITION-NAME ```這解決了快速刪除舊數據的問題。 2. **旋轉表** * 假設您的大桌子是`table_a`. 創建一個空表,將其命名為`table_b`,其結構與`table_a`. * 每週一次,在數據庫的非高峰或夜間時間執行以下操作。 1. `table_a`在after創建 3 個觸發器`insert/update/delete`。讓它對`table_b`. 2. 現在從上週獲取數據`table_a`並將其應用於`table_b`1000 條記錄批次,直到今天。 ``` insert into table_b select * from table_a where date > date_time(LASTWEEK'S DAY) and date < date_time(TODAY_TIME_AFTER_ADDING_TRIGGERS); ``` 您可以分解`where`千塊記錄中的條件,為上述`where`子句執行此操作。 如果觸發器已開始填充數據,請確保從`table_a`to開始插入一次。`table_b` 3. 重命名`table_a`為`table_old`和。`table_b``table_a` 4. 重命名後操作正常後,您可以繼續使用`drop table table_b`. 5. 不要忘記放下觸發器。 這解決了每週的碎片整理和空間使用問題。但這是一個漫長的過程。 對於選項 2(Rotate Table),我在觸摸每秒有 200 個 DML 且每週數據超過 200 GB 的表時也有所保留。有效。但是您可以在測試環境中對此進行模擬並查看吞吐量。您應該對要觸發的應用程序和命令的響應時間充滿信心。無論如何你的電話。這只是我可以建議的方向,我已經越過了。一切順利。