當MySQL成為越來越多的web2網站的選擇的DB的時候,當網站越來越大,流量越來越多,使用者越來越多的時候,資料庫往往第一個成為系統的瓶頸,如何提升DB的效能成為系統成敗的關鍵點,本文只是從自己的認識上說說可以從幾個方面提升MySQL的效能,以及可以採取的擴充方式。但是不會詳細的闡述,詳細的說明和操作,分析方法以後有時間再仔細分享。
一、選擇合適的資料庫存貯引擎
MySQL支援的引擎很多,例如MyISAM,MEMORY,InnoDB等等類型,每個類型試用的情境是不一樣的,恰當的選擇儲存引擎可以節省你不少時間,詳細的介紹你可以參考”第15章:儲存引擎和表類型“。
二、最佳化SQL語句
不要以為SQL語句關係不大,按照以往的經驗,往往幾個畸形的SQL就可以拖垮一個DB,決定不是危言聳聽,在從系統最佳化和DB最佳化及其擴充之前,請仔細檢查系統中用到的SQL,先解決SQL可能帶來的問題,而經驗是,做好這步,就可以解決很多初期的效能問題。
三、建立索引
這和前面的SQL最佳化有一定的聯絡,仔細查看你的SQL語言,儘可能的最佳化他,然後建立必須的索引,千萬不要忽視了索引的威力,我們曾經有過測試,2W條的基本資料,產生頁面,沒有索引前,推算其全部產生需要的時間是81個小時,而加上索引後,只需要12分鐘,多大的效能提升,各位可以自己那計算機粗略的算算。
四、建立分區&資料表空間
很多人以為只有Oracle才有資料表空間,分區這些東西,不想到MYSQL中也有類似的東西吧,儘管這個東西是mysql5才引入的,儘管其還不是很成熟,但是毫無疑問,這是一個好的訊號,在我們使用MYSQL的時候就有了更多的方案來提升效能了。
分區一般分為水平資料分割和垂直資料分割,MYSQL目前只支援水平資料分割,有RANGE,LIST,HASH,KEY等等分區方式,詳細說明以後再說,你可以參考”第18章:分區“,"通過分區(Partition)提升MySQL效能"等文章。
資料表空間的相關話題,可以參考”第17章:MySQL簇“,不在贅述。
五、調整MYSQL和系統參數
這個方案是伴隨著整個效能提升過程的,你的不時的調整參數以得到更好的效能,這個比較複雜,沒有啥成文的規定,都是靠經驗或者實踐得到的。
六、叢集或者proxy
到這裡為止,單機的MYSQL基本上可以最佳化調整的都涉及到了,如果這個時候還是頂不住壓力,該考慮水平擴充或者垂直擴充了,垂直擴充比較容易,只要針對單機的效能得到瓶頸的所在,增加CPU或者記憶體或者換比較強勁的裝置就可以很快得到立竿見影的效果。
但是垂直擴充能力有限,不可能得到無限級的擴充,風險也比較大,除了垂直擴充,大家選擇較多的是水平擴充,也就是通過增加伺服器,無限的得到效能的擴充,當然這個裡面內容是很多的,如何做到資料庫的備份,同步等都是需要考慮和解決的問題,而且還要考慮這麼多機器間的資料重複成都等問題;除此之外,還有可能將資料庫緩衝到memcached或者使用mysql proxy等實現串連池之類的方案,都是需要考慮和抉擇的。
以上每個分類都是個大的話題,這麼一篇文章只是說明了最佳化的思路和基本流程,其中涉及到很多東西,例如診斷和分析等都是很有技術含量的,我們下次會一個專題一個專題的仔細分析,力求將MYSQL的效能達到儘可能的榜。