Mysql

大量刪除後的 AWS RDS 後期優化

  • September 14, 2017

我正在使用 AWS RDS MySQL。所有表都在InnoDB並啟用innoDB_file_per_table

我的一個日誌表增長太快了。我想刪除超過 1 週的數據。甚至1 週的數據是 120GB。每個週末,該作業都會執行並刪除舊數據。

我想回收磁碟空間並更新統計資訊。OPTIMIZE餐桌對我們來說真的很痛苦。

刪除大量記錄後我應該執行哪些優化?

PARTITION BY RANGE(TO_DAYS(date))並有每日分區。每天晚上DROP PARTITION將一周舊的分區和REORGANIZE通常空的“未來”分區變成明天和一個新的“未來”。

這使得刪除基本上是免費和即時的。並將磁碟空間減少到不超過一周的數據量。

更多細節

(不需要觸發器,不需要表輪換。查詢可以在PARTITIONed表上透明地工作。可能需要對索引進行一些更改。)

您可以嘗試以下選項。

  1. 將分區與 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 的表時也有所保留。有效。但是您可以在測試環境中對此進行模擬並查看吞吐量。您應該對要觸發的應用程序和命令的響應時間充滿信心。無論如何你的電話。這只是我可以建議的方向,我已經越過了。一切順利。

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