程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL 刪除大表的性能問題解決方案

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

編輯:關於MYSQL數據庫
微博上討論MySQL在刪除大表engine=innodb(30G+)時,如何減少MySQL hang的時間,現做一下簡單總結:

當buffer_pool很大的時候(30G+),由於刪除表時,會遍歷整個buffer pool來清理數據,會導致MySQL hang住,解決的辦法是:
1、當innodb_file_per_table=0的時候,以上不是問題,因為采用共享表空間的時候,該表所占用的空間不會被刪除,buffer pool中的相關頁不會 被discard。
2、當innodb_file_per_table=1的時候,並且當buffer_pool比較大的時候,遍歷整個buffer pool 需要很多的時間(table_cache 會被鎖住,所有的DML操作被阻止)。

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

解決思路
1、采用腳本形式,批量刪除部分記錄
2、可以再slave上進行操作,進行主備切換(成本高)
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時, 刪除文件需要去把這個文件相關的所有數據塊清除,所以會比較耗時)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved