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