MySQL 刪除大表的性能問題解決方案
更新時(shí)間:2012年11月24日 18:51:56 作者:
MySQL在刪除大表engine=innodb(30G+)時(shí),如何減少M(fèi)ySQL hang的時(shí)間,本為將提供詳細(xì)的解決方案,需要了解的朋友可以參考下
微博上討論MySQL在刪除大表engine=innodb(30G+)時(shí),如何減少M(fèi)ySQL hang的時(shí)間,現(xiàn)做一下簡(jiǎn)單總結(jié):
當(dāng)buffer_pool很大的時(shí)候(30G+),由于刪除表時(shí),會(huì)遍歷整個(gè)buffer pool來清理數(shù)據(jù),會(huì)導(dǎo)致MySQL hang住,解決的辦法是:
1、當(dāng)innodb_file_per_table=0的時(shí)候,以上不是問題,因?yàn)椴捎霉蚕肀砜臻g的時(shí)候,該表所占用的空間不會(huì)被刪除,buffer pool中的相關(guān)頁不會(huì) 被discard。
2、當(dāng)innodb_file_per_table=1的時(shí)候,并且當(dāng)buffer_pool比較大的時(shí)候,遍歷整個(gè)buffer pool 需要很多的時(shí)間(table_cache 會(huì)被鎖住,所有的DML操作被阻止)。
認(rèn)識(shí)誤區(qū):
將innodb 表改為 myisam表,這個(gè)是沒有效果的,該操作會(huì)刪除舊表,建立新表,依然會(huì)遍歷整個(gè)buffer_pool。
解決思路:
1、采用腳本形式,批量刪除部分記錄
2、可以再slave上進(jìn)行操作,進(jìn)行主備切換(成本高)
3、Percona 5.1.58以上版本都支持innodb_lazy_drop_table(bug不少,慎用)
4、與buffer pool無關(guān),但是可以加快 刪除數(shù)據(jù)文件的速度,同樣能減少M(fèi)ySQL hang住的時(shí)間。即:對(duì)數(shù)據(jù)文件建立硬鏈接,(依賴原理:OS HARD LINK 當(dāng)多個(gè)文件名同時(shí)指向同一個(gè)INODE時(shí),這個(gè)INODE的引用數(shù)N>1, 刪除其中任何一個(gè)文件名只是刪除了一個(gè)指針而已,不會(huì)刪除數(shù)據(jù)文件。當(dāng)INODE的引用數(shù)N=1時(shí), 刪除文件需要去把這個(gè)文件相關(guān)的所有數(shù)據(jù)塊清除,所以會(huì)比較耗時(shí))
當(dāng)buffer_pool很大的時(shí)候(30G+),由于刪除表時(shí),會(huì)遍歷整個(gè)buffer pool來清理數(shù)據(jù),會(huì)導(dǎo)致MySQL hang住,解決的辦法是:
1、當(dāng)innodb_file_per_table=0的時(shí)候,以上不是問題,因?yàn)椴捎霉蚕肀砜臻g的時(shí)候,該表所占用的空間不會(huì)被刪除,buffer pool中的相關(guān)頁不會(huì) 被discard。
2、當(dāng)innodb_file_per_table=1的時(shí)候,并且當(dāng)buffer_pool比較大的時(shí)候,遍歷整個(gè)buffer pool 需要很多的時(shí)間(table_cache 會(huì)被鎖住,所有的DML操作被阻止)。
認(rèn)識(shí)誤區(qū):
將innodb 表改為 myisam表,這個(gè)是沒有效果的,該操作會(huì)刪除舊表,建立新表,依然會(huì)遍歷整個(gè)buffer_pool。
解決思路:
1、采用腳本形式,批量刪除部分記錄
2、可以再slave上進(jìn)行操作,進(jìn)行主備切換(成本高)
3、Percona 5.1.58以上版本都支持innodb_lazy_drop_table(bug不少,慎用)
4、與buffer pool無關(guān),但是可以加快 刪除數(shù)據(jù)文件的速度,同樣能減少M(fèi)ySQL hang住的時(shí)間。即:對(duì)數(shù)據(jù)文件建立硬鏈接,(依賴原理:OS HARD LINK 當(dāng)多個(gè)文件名同時(shí)指向同一個(gè)INODE時(shí),這個(gè)INODE的引用數(shù)N>1, 刪除其中任何一個(gè)文件名只是刪除了一個(gè)指針而已,不會(huì)刪除數(shù)據(jù)文件。當(dāng)INODE的引用數(shù)N=1時(shí), 刪除文件需要去把這個(gè)文件相關(guān)的所有數(shù)據(jù)塊清除,所以會(huì)比較耗時(shí))
相關(guān)文章
MySQL 5.6 & 5.7最優(yōu)配置文件模板(my.ini)
這篇文章主要介紹了MySQL 5.6 & 5.7最優(yōu)配置文件模板(my.ini),需要的朋友可以參考下2016-07-07
MySQL5綠色版windows下安裝總結(jié)(推薦)
這篇文章主要介紹了MySQL5綠色版windows下安裝總結(jié),需要的朋友可以參考下2017-03-03
select?into?from和insert?into?select的區(qū)別舉例詳解
這篇文章主要介紹了SQL中的SELECT?INTO和INSERT?INTO?SELECT兩種語句的區(qū)別和用法,SELECT?INTO用于創(chuàng)建新表并復(fù)制數(shù)據(jù)到新表中,而INSERT?INTO?SELECT用于將數(shù)據(jù)從一個(gè)表插入到已存在的另一個(gè)表中,需要的朋友可以參考下2025-03-03
解決MySQL報(bào)錯(cuò)incorrect?datetime?value?'0000-00-00?00:00
這篇文章主要給大家介紹了關(guān)于如何解決MySQL報(bào)錯(cuò)incorrect?datetime?value?'0000-00-00?00:00:00'?for?column的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
MySql數(shù)據(jù)庫之a(chǎn)lter表的SQL語句集合
mysql之a(chǎn)lter表的SQL語句集合,包括增加、修改、刪除字段,重命名表,添加、刪除主鍵等。本文給大家介紹MySql數(shù)據(jù)庫之a(chǎn)lter表的SQL語句集合,感興趣的朋友一起學(xué)習(xí)吧2016-04-04

