MYSQL大表刪除
1. 選場景選策略
- 整張表的數據全部刪除
如果是整張表的數據全部清空、刪除,這種場景倒是非常簡單,TRUNCATE TABLE肯定是最快的。反而用DELETE處理的話,就是一個糟糕的策略。
- 大表中刪除一部分數據
刪除大表中絕大部分的數據,但是這個絕大部分怎么定義不好量化,所以我們這里就量化為60%。如果刪除的數據比例超過60%,就采用下面方法:
-
新 建表TEST_TMP
-
將要保留的數據轉移到TEST_TMP
-
將原表TEST重命名為TEST_OLD, 而將TEST_TMP重命名為TEST
-
檢查相關的觸發器、約束,進行觸發器或約束的重命名
-
核對操作是否正確后,原表(TEST_OLD)要么TRUANCATE后,再DROP掉。要么保留一段時間,保險起見。
刪除大表中部分數據,如果比例不超過60%:
-
先刪除或禁用無關索引(無關索引,這里指執行計划不用到的索引,這里是指對當前DELETE語句無用的索引)。因為DELETE操作屬於DML操作,而且大表的索引一般也非常大,大量DELETE將會對索引進行維護操作,產生大量額外的IO操作。
-
用小批量,分批次刪除(批量刪除比一次性刪除性能要快很多)。不要一次性刪除大量數據。一次性刪除大量記錄。會導致鎖的粒度范圍很大,並且鎖定的時間非常長,而且還可能產生阻塞,嚴重影響業務等等。而且數據庫的事務日志變得非常大。執行的時間變得超長,性能非常糟糕。
2. 准備工作
利用 MYSQL 存儲過程向表中添加大量測試數據,示例:
3. 落地實踐方案
結合本項目的實際,本次選取方案為分批次刪除表中數據,首先查出來滿足條件的表中數據總數,對總數與每次刪除數進行向上取余,得出需執行 DELETE 次數,最終循環執行刪除操作。每次刪除總數結合實際進行選取,本案例選取每次刪除 1 萬條數據。
- 總數方案1
- 總數方案2
- 槽方案
注意:本例中需注意時間異步問題,應當選取 JAVA8 提供的時間操作類。Calendar 類在使用中需開發者自行解決異步問題。
引用:https://blog.csdn.net/weixin_42302384/article/details/114587546?utm_term=calendar線程安全的&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-6-114587546&spm=3001.4430
測試:此次測試分為本地本機測試與遠程數據庫服務器測試,其中主要考慮因素為本機與服務器機器性能之間的差異,網絡原因不在測試考慮范圍內。
以下測試均是批量刪除,每次刪除數據為 1 萬條(本地本機數據庫):
億數據刪除十萬
億數據刪除百萬
千萬數據刪除十萬
千萬數據刪除百萬
百萬數據刪除十萬
每次刪除數據為 10 萬條(服務器數據庫),數據庫最大連接時長3分:
百萬數據刪除十萬
千萬數據刪除十萬
八千萬數據刪除十萬
億數據刪除十萬
引用:
https://www.jb51.net/article/207999.htm
http://c.biancheng.net/mysql/85/