MYSQL 大表刪除數據


MYSQL大表刪除

1. 選場景選策略

  • 整張表的數據全部刪除

如果是整張表的數據全部清空、刪除,這種場景倒是非常簡單,TRUNCATE TABLE肯定是最快的。反而用DELETE處理的話,就是一個糟糕的策略。

  • 大表中刪除一部分數據

刪除大表中絕大部分的數據,但是這個絕大部分怎么定義不好量化,所以我們這里就量化為60%。如果刪除的數據比例超過60%,就采用下面方法:

  1. 新 建表TEST_TMP

  2. 將要保留的數據轉移到TEST_TMP

  3. 將原表TEST重命名為TEST_OLD, 而將TEST_TMP重命名為TEST

  4. 檢查相關的觸發器、約束,進行觸發器或約束的重命名

  5. 核對操作是否正確后,原表(TEST_OLD)要么TRUANCATE后,再DROP掉。要么保留一段時間,保險起見。

刪除大表中部分數據,如果比例不超過60%:

  1. 先刪除或禁用無關索引(無關索引,這里指執行計划不用到的索引,這里是指對當前DELETE語句無用的索引)。因為DELETE操作屬於DML操作,而且大表的索引一般也非常大,大量DELETE將會對索引進行維護操作,產生大量額外的IO操作。

  2. 用小批量,分批次刪除(批量刪除比一次性刪除性能要快很多)。不要一次性刪除大量數據。一次性刪除大量記錄。會導致鎖的粒度范圍很大,並且鎖定的時間非常長,而且還可能產生阻塞,嚴重影響業務等等。而且數據庫的事務日志變得非常大。執行的時間變得超長,性能非常糟糕。

2. 准備工作

利用 MYSQL 存儲過程向表中添加大量測試數據,示例:

3. 落地實踐方案

結合本項目的實際,本次選取方案為分批次刪除表中數據,首先查出來滿足條件的表中數據總數,對總數與每次刪除數進行向上取余,得出需執行 DELETE 次數,最終循環執行刪除操作。每次刪除總數結合實際進行選取,本案例選取每次刪除 1 萬條數據。

  1. 總數方案1

  1. 總數方案2

  1. 槽方案

注意:本例中需注意時間異步問題,應當選取 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/

https://www.cnblogs.com/imoing/p/3426324.html

https://www.cnblogs.com/kerrycode/p/12448322.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM