Posted on 2009-12-11 10:47
itVincent 閱讀(6370)
評論(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)入到本地數(shù)據(jù)庫運(yùn)行,速度很快,沒有出現(xiàn)上述問題
陷入困境,求教于DBA,DBA也很茫然,查看進(jìn)程,每次執(zhí)行那些SQL語句進(jìn)程占用CPU都非常高;沒有錯誤的日志;MYSQL也運(yùn)行了2個多月沒重啟過;硬盤也檢查過OK的,也懷疑是raid有問題。
查了這么多也沒有找到原因,包括mysql和應(yīng)用服務(wù)器都重啟過了。
最后DBA說用Analyze Table的方法看看。
語句是:
ANALYZE TABLE MYTABLE;
運(yùn)行后,問題解決,速度恢復(fù)正常。
MySQL 的在優(yōu)化SQL語句時,首先需要收集一些相關(guān)信息,其中就包括表的cardinality(可以翻譯為“散列程度”),它表示某個索引對應(yīng)的列包含多少個不同的值——如果cardinality大大少于數(shù)據(jù)的實際散列程度,那么索引就基本失效了。
我們可以使用SHOW INDEX語句來查看索引的散列程度。
TABLE KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
MYTABLE PRIMARY ORG_ID_FK 10
此時可以看到,MYTABLE 數(shù)據(jù)有幾百,但是CARDINALITY只有10,可見CARDINALITY大大少于數(shù)據(jù)量,因此這個索引基本起不到作用,例如當(dāng)查詢語句對這個字段用到j(luò)oin連接時,由于索引的失效,查詢就會變得很慢。
在使用了ANALYZE TABLE后cardinality被增大到了500,因此查詢的性能得到了提高。