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