MySQL的監控和調優

2021-05-23 23:46:57 字數 3635 閱讀 1267

懂php的人一般都懂mysql這一點不假,大多數書籍裡也是這樣,書中前面講php後面到資料庫這塊就會講到mysql的一些知識,前幾年mysql一直是php書籍的一部分,後來開始從國外翻譯了一些專門講述mysql的書籍。但大多數還是不如mysql手冊裡講的精細。

目前國內也有了一些講mysql比較好的資料,我推薦幾本大家可以看,一本是《mysql效能調優與架構設計》,一本是《深入淺出mysql--資料庫開發、優化與管理維護》這兩本是筆者確實讀過的,也是國內兩隻比較有實力的dba團隊的經驗之談。

書大家可以買回去慢慢讀,作為一篇文章篇幅有限,我只用片言片語引導性的介紹一些mysql監控和優化方面的知識,這就算是一種普及式的講解,深入的了解我會在文中插入一些參考閱讀,深入了解大家可以在參考閱讀中獲取。

mysql的監控和除錯辦法也是mysql逐步發展一步步完善起來的,大體上可以被分為幾個方面,從日誌分析效能瓶頸,從執行時資訊觀察效能,從執行引數調優,對執行語句進行分析調優等。

第一種方法,慢查詢日誌

慢查詢是mysql自帶的一種長期觀測執行效率的日誌系統,對於長期運營的大型**是必須要開啟的一項服務,對於那些流量極少或是一般性的企業小站而言,是沒有必要的,所以我發現很多正在做外包或正在做企業**的朋友,對這方面就不太在意,甚至可能並不清楚這東西,如果想開啟慢查詢,需要在my.ini或my.cnf中加入以下語句:

記錄執行在1秒以上的慢查詢,初期如果**沒有進行過任何優化,光日誌一天就要幾十兆並不少見。日誌中記錄了從被監控的時候起到目前的所有可被稱為慢查詢的sql語句,不一定慢的就是select,update這樣的操作也有可能,有時候更新索引比查詢要更慢。

如果你發現日誌太大,可以先調整一下long_query_time,例如放寬到5秒,先解決一些最棘手的慢查詢,逐步縮小時間,直到有一天你發現慢查詢日誌基本消失為止,最好是完全消失,例如以下日誌:

# time: 090909 14:04:24

# user@host: sparty[sparty] @  [localhost]

# query_time: 20  lock_time: 0  rows_sent: 10  rows_examined: 2500284

select * from test order by views limit 10;

query_time : 執行時間20秒已經很慢了。

lock_time :  鎖定時間0秒,如果鎖的時間較長,應該找到引起鎖等待的語句。

rows_sent : 返回10行記錄

rows_examined: 一共影響了250萬行記錄

這四個引數每個都需要仔細看,例如最後乙個影響的記錄數往往可以進一步縮小,例如用時間範圍進一步縮小範圍。從250萬行資料中返回10行這明顯是大動干戈了。

select * from test where create_time > '***xx' order by views limit 10;

返回兩周以來的資料中最新的10條資料,也許這時候你會看到rows_examined會被減少到2萬行,甚至更少。

第二種方法,show [full] processlist

這是我學過的最早的一條分析語句,當線上系統不正常執行的時候,可以在任何客戶端下輸入show processlist指令來觀察當前mysql正在執行的sql語句。有三種情況是立即可以發現問題的,某update或select語句反覆執行這可能是你的快取沒有生效,導致與資料庫頻繁互動,也許你會看到state這一列有大量的locked標誌,說明你的資料庫由於讀寫衝突產生了鎖,同時觀察到time一列的時間很大,這需要找到最初被鎖的語句,後面的語句往往是受到最早那條語句的影響。最後一種情況出現大量的unauthenticated user,這是乙個非常經典的問題,解決辦法是在mysql啟動引數中增加skip-name-resolve即不啟用dns反向解析。

我只是提到了最普遍的三種現象關於show processlist的詳細使用,可以通過網路中其他文章進行更細的了解。

第三種方法 explain

無論我們從慢查詢日誌還是從show指令當中拿到了一條具體的有效率問題的sql語句,經驗豐富並且語句並不複雜的基礎上可以人為判斷出問題的所在,但大多數情況下還是要依賴explain命令通過mysql本身的優化策略來找到問題的關鍵所在,這條指令幫助我們分析sql語句的執行效率,例如sql語句是否利用到了索引,是否進行了額外的排序,是否進行了全表掃瞄等,實際上sql語句並沒有執行,僅僅是通過explain對可能的執行效率進行了詳細的分析,幫助程式設計師對sql語句的索引等進行優化。網上對explain的分析文章較多,但最詳細的還是建議大家多看mysql參考手冊,應該描述的相對比較全面了,另外最近也發現explain可以和其它一些命令選項配合使用,具體可以參考老王的一篇文章http://hi.baidu.com/thinkinginlamp/blog/item/eef0cd119239db17b8127b6f.html詳細寫了關於explain的一些使用上的問題。不過對於explain最直接有效的方法還是看mysql手冊。

第四種方法 profile

利用profile可以觀察mysql占用的cpu及記憶體等資訊,早期版本並不支援profile,所以你要確定自己的mysql至少是5.0.37版關於profile的詳細用法筆者也推薦一篇資料大家可以查閱,位址是:http://blog.csdn.net/radkitty/archive/2009/10/04/4632289.aspx

第五種方法 調整mysql引數和狀態

1. 修改啟動引數

mysql引數一共有兩種,第一種是啟動引數,需要在mysql啟動之前改寫my.cnf檔案或新增到啟動命令列中才可以生效,例如前面提到的慢查詢日誌,需要在啟動前配置my.cnf檔案。

2. 修改執行時狀態及變數

mysql在執行時通過兩組資料來描述mysql的狀態,一種是variables變數集合,一種是status狀態集合,例如在命令列下輸入如下兩個命令:

mysql> show global variables like '%cache%';

mysql> show global status like '%cache%';

第一行用於獲取與cache有關的變數資訊,例如是否開啟了查詢快取,快取有多大。第二行使用者獲取與cache有關的狀態資訊,例如快取已經被使用了多少,還剩餘多少等。

關於mysql引數的調優的確有點複雜,一般應該是dba來進行處理,但對於php程式設計師多了解些也無妨,因為大多數公司是沒有專門的mysql dba的,所以這些工作還是需要我們自己來完成。

狀態是無法設定的,只有變數可以,例如:

set global query_cache_size = 32 * 1024 * 1024;

我加大了 query_cache_size ,查詢快取大小。

由於工作關係我經常的需要幫公司除錯各類mysql狀態,每次也是要重新查閱不少資料,因為mysql的變數和狀態值相當多,並且經常暗含一些公式,所以為了減輕每次的工作負擔我寫了乙個軟體叫mysqlmonitor,目前公司內的所有mysql都使用這個軟體進行了監控,通過這個軟體可以獲取對mysql引數和狀態優化的一些建議資訊。就和我在現場除錯差不多。

mysqlmonitor中的優化演算法**於已經向大家推薦的兩本mysql專業書籍,以及對mysql引數手冊中一些演算法公式的研究,也包括一些自己的經驗所得,可以從http://www.echohello.cn/獲取到這個軟體。

論MySQL的監控和調優

論mysql的監控和調優 懂php的人一般都懂mysql這一點不假,大多數書籍裡也是這樣,書中前面講php後面到資料庫這塊就會講到mysql的一些知識,前幾年mysql一直是php書籍的一部分,後來開始從國外翻譯了一些專門講述mysql的書籍。但大多數還是不如mysql手冊裡講的精細。目前國內也有了...

Mysql 效能監控及調優

死鎖概念 兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象 1.監控死鎖 innotop 1 啟用 innodb status file 在 etc my.cnf新增如下 mysqld innodb status file 1 於 var lib mysql 下檢視.err日誌...

MySQL調優之效能監控

參考資料 show profile type type for query n limit row count offset offset type type 引數解釋 set profiling 1 此工具預設是禁用的,可以通過伺服器變數在會話級別動態的修改。當設定完成之後,在伺服器上執行的所有語...