itVincent Blog - Java Working Fun!

          技術引領時代!
          posts - 117, comments - 181, trackbacks - 0, articles - 12

          MySQL數據庫查詢變慢的分析及解決過程

          Posted on 2009-12-11 10:47 itVincent 閱讀(6377) 評論(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,因此查詢的性能得到了提高。

          Feedback

          # re: MySQL數據庫查詢變慢的分析及解決過程  回復  更多評論   

          2009-12-11 19:35 by feenn
          很好,受教!

          # re: MySQL數據庫查詢變慢的分析及解決過程  回復  更多評論   

          2009-12-12 13:25 by 久久書城
          十六大開發開始打開

          # re: MySQL數據庫查詢變慢的分析及解決過程  回復  更多評論   

          2009-12-15 18:02 by java狼
          @久久書城
          能舉報屏蔽了這個賤人么……
          主站蜘蛛池模板: 仪征市| 广灵县| 河曲县| 阆中市| 墨竹工卡县| 师宗县| 务川| 连州市| 大兴区| 六盘水市| 白城市| 临朐县| 奎屯市| 嘉祥县| 贡嘎县| 大宁县| 本溪市| 嘉善县| 双城市| 花莲县| 天水市| 罗城| 富川| 东方市| 婺源县| 伊春市| 普安县| 泗洪县| 黔西| 栖霞市| 西和县| 平湖市| 弥勒县| 东平县| 桦川县| 凤凰县| 屯昌县| 五台县| 高唐县| 时尚| 上栗县|