MySQL 刪除大表的效能問題解決方案

2022-09-27 06:18:10 字數 875 閱讀 7716

微博上討論mysql在刪除大表engine=innodb(30g+)時,如何減少my hang的時間,現做一下簡單總結:

當buffer_pool很大的時候(30g+),由於刪除表時,會遍歷整個buffer pool來清理資料,會導致mysql hang住,解決的辦法是:

1、當innodb_file_per_table=0的時候,以上不是問題,因為採用共享表空間的時候,該錶所占用的空間不會被刪除,buffer pool中的相關頁不程式設計客棧會 被discard。

2、當innodb_file_per_www.cppcns.comtable=1的時候,並且當buffer_pool比較大的時候,遍歷整個buffer poyibofol 需要很多的時間(table_cache 會被鎖住,所有的dml操作被阻止)。

認識誤區:

將innodb 表改為 myisam表,這個是沒有效果的,該操作會刪除舊表,建立新錶,依然會遍歷整個buffer_pool。

解決思路:

1、採用指令碼形式,批量刪除部分記錄

2、可以再sl**e上進行操作,進行主備切換(成本高)

3、percona 5.1.58以上版本都支援innodb_lazy_drop_table(bug不少,慎用)

4、與buffer pool無關,但是可以加快 刪除資料檔案的速度,同樣能減少mysql hang住的時間。即:對資料檔案建立硬鏈結,(依賴原理:os hard link 當多個檔名同時指向同乙個inode時,這個inode的引用數n>1, 刪除其中任何乙個檔名只是刪除了乙個指標而已,不會刪除資料檔案。當inode的引用數n=1時, 刪除檔案需要去程式設計客棧把這個檔案相關的所有資料塊清除,所以會比較耗時)

本文標題: mysql 刪除大表的效能問題解決方案

本文位址:

mysql刪除大表更快的drop table辦法

曾經發文介紹過,drop table 特別是碰到大表時,在drop table 過程中,所有操作都會被hang住。這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ext3,ext4,ntfs檔案系統,要刪除乙個大檔案 幾十g,...

mysql刪除大表更快的drop table辦法

利用硬鏈結和truncate降低drop table對線上環境的影響 在drop table的時候,所有程序不管是ddl還是dml都被hang起 直到drop結束才繼續執行 這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ex...

MySQL 儲存過程刪除大表

1 許可權問題 alter routine 編輯或刪除儲存過程 create routine 建立儲存過程 execute 建立儲存過程 2 儲存過程相關的一些命令 show procedure status g 檢視資料庫中有哪些儲存過程 show procedure status where d...