MySQL數(shù)據(jù)庫(kù)查詢變慢的分析及解決過(guò)程
Posted on 2009-12-11 10:47 itVincent 閱讀(6396) 評(píng)論(3) 編輯 收藏 所屬分類(lèi): Java應(yīng)用最近客戶提出某些業(yè)務(wù)查詢數(shù)據(jù)的速度特別慢,而且這種情況來(lái)的比較突然。
情況:
1.系統(tǒng)最近沒(méi)有更新
2.數(shù)據(jù)庫(kù)結(jié)構(gòu)沒(méi)有更改
3.沒(méi)有大量增加過(guò)數(shù)據(jù)
分析:
1.應(yīng)用服務(wù)器問(wèn)題:嘗試把慢的業(yè)務(wù)的SQL語(yǔ)句取出到mysql命令行執(zhí)行,速度依然很慢
2.VPN問(wèn)題:把業(yè)務(wù)系統(tǒng)數(shù)據(jù)導(dǎo)出,再導(dǎo)入到本地?cái)?shù)據(jù)庫(kù)運(yùn)行,速度很快,沒(méi)有出現(xiàn)上述問(wèn)題
陷入困境,求教于DBA,DBA也很茫然,查看進(jìn)程,每次執(zhí)行那些SQL語(yǔ)句進(jìn)程占用CPU都非常高;沒(méi)有錯(cuò)誤的日志;MYSQL也運(yùn)行了2個(gè)多月沒(méi)重啟過(guò);硬盤(pán)也檢查過(guò)OK的,也懷疑是raid有問(wèn)題。
查了這么多也沒(méi)有找到原因,包括mysql和應(yīng)用服務(wù)器都重啟過(guò)了。
最后DBA說(shuō)用Analyze Table的方法看看。
語(yǔ)句是:
ANALYZE TABLE MYTABLE;
運(yùn)行后,問(wèn)題解決,速度恢復(fù)正常。
MySQL 的在優(yōu)化SQL語(yǔ)句時(shí),首先需要收集一些相關(guān)信息,其中就包括表的cardinality(可以翻譯為“散列程度”),它表示某個(gè)索引對(duì)應(yīng)的列包含多少個(gè)不同的值——如果cardinality大大少于數(shù)據(jù)的實(shí)際散列程度,那么索引就基本失效了。
我們可以使用SHOW INDEX語(yǔ)句來(lái)查看索引的散列程度。
TABLE KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
MYTABLE PRIMARY ORG_ID_FK 10
此時(shí)可以看到,MYTABLE 數(shù)據(jù)有幾百,但是CARDINALITY只有10,可見(jiàn)CARDINALITY大大少于數(shù)據(jù)量,因此這個(gè)索引基本起不到作用,例如當(dāng)查詢語(yǔ)句對(duì)這個(gè)字段用到j(luò)oin連接時(shí),由于索引的失效,查詢就會(huì)變得很慢。
在使用了ANALYZE TABLE后cardinality被增大到了500,因此查詢的性能得到了提高。
情況:
1.系統(tǒng)最近沒(méi)有更新
2.數(shù)據(jù)庫(kù)結(jié)構(gòu)沒(méi)有更改
3.沒(méi)有大量增加過(guò)數(shù)據(jù)
分析:
1.應(yīng)用服務(wù)器問(wèn)題:嘗試把慢的業(yè)務(wù)的SQL語(yǔ)句取出到mysql命令行執(zhí)行,速度依然很慢
2.VPN問(wèn)題:把業(yè)務(wù)系統(tǒng)數(shù)據(jù)導(dǎo)出,再導(dǎo)入到本地?cái)?shù)據(jù)庫(kù)運(yùn)行,速度很快,沒(méi)有出現(xiàn)上述問(wèn)題
陷入困境,求教于DBA,DBA也很茫然,查看進(jìn)程,每次執(zhí)行那些SQL語(yǔ)句進(jìn)程占用CPU都非常高;沒(méi)有錯(cuò)誤的日志;MYSQL也運(yùn)行了2個(gè)多月沒(méi)重啟過(guò);硬盤(pán)也檢查過(guò)OK的,也懷疑是raid有問(wèn)題。
查了這么多也沒(méi)有找到原因,包括mysql和應(yīng)用服務(wù)器都重啟過(guò)了。
最后DBA說(shuō)用Analyze Table的方法看看。
語(yǔ)句是:
ANALYZE TABLE MYTABLE;
運(yùn)行后,問(wèn)題解決,速度恢復(fù)正常。
MySQL 的在優(yōu)化SQL語(yǔ)句時(shí),首先需要收集一些相關(guān)信息,其中就包括表的cardinality(可以翻譯為“散列程度”),它表示某個(gè)索引對(duì)應(yīng)的列包含多少個(gè)不同的值——如果cardinality大大少于數(shù)據(jù)的實(shí)際散列程度,那么索引就基本失效了。
我們可以使用SHOW INDEX語(yǔ)句來(lái)查看索引的散列程度。
TABLE KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
MYTABLE PRIMARY ORG_ID_FK 10
此時(shí)可以看到,MYTABLE 數(shù)據(jù)有幾百,但是CARDINALITY只有10,可見(jiàn)CARDINALITY大大少于數(shù)據(jù)量,因此這個(gè)索引基本起不到作用,例如當(dāng)查詢語(yǔ)句對(duì)這個(gè)字段用到j(luò)oin連接時(shí),由于索引的失效,查詢就會(huì)變得很慢。
在使用了ANALYZE TABLE后cardinality被增大到了500,因此查詢的性能得到了提高。