天天看點

MySQL 删除大表的性能問題

當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時, 删除檔案需要去把這個檔案相關的所有資料塊清除,是以會比較耗時)

參考連結:

<a href="http://www.mysqlops.com/2011/05/18/mysql%E5%88%A0%E9%99%A4%E5%A4%A7%E8%A1%A8%E6%9B%B4%E5%BF%AB%E7%9A%84drop-table%E5%8A%9E%E6%B3%95.html" target="_blank">faster drop</a>

<a href="http://www.mysqlperformanceblog.com/2011/02/03/performance-problem-with-innodb-and-drop-table/" target="_blank">performance drop</a>

<a href="http://www.mysqlsky.com/201211/large-tbl-drop" target="_blank">安全删除大表</a>

本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/947985,如需轉載請自行聯系原作者