數據庫響應慢問題最多的就是查詢了。現在大部分數據庫都提供了性能分析的幫助手段。例如Oracle中會幫你直接找出慢的語句,并且提供優化方案。在MySQL中就要自己開啟慢日志記錄加以分析(記錄可以保存在表或者文件中,默認是保存在文件中,我們系統使用的就是默認方式)。
先看看MySQL慢查詢日志里面的記錄長什么樣的:
| Time Id Command Argument# Time: 141010 9:33:57# User@Host: root[root] @ localhost [] Id: 1# Query_time: 0.000342 Lock_time: 0.000142 Rows_sent: 3 Rows_examined: 3use test;SET timestamp=1412904837;select * from t; |
這個日志應該很好理解了,第一個#記錄時間戳,第二個#記錄執行命令的用戶和地址信息,第三個#記錄執行查詢的時間、鎖的時間、返回行數、被掃描的行數。接著后面記錄真正執行的SQL語句。還可以通過以下命令看看cvs存儲格式每個字段意義。
| SHOW CREATE TABLE mysql.slow_log; |
接下來說說如何獲取和分析慢日志吧。
查看MySQL慢日志參數
進入啟動好的MySQL,執行以下命令
| mysql> show variables like '%slow_query%'; |
| +---------------------------+----------------------------------------+| Variable_name | Value |+---------------------------+----------------------------------------+| slow_query_log | OFF || slow_query_log_file | /usr/local/mysql/data/cloudlu-slow.log |+---------------------------+----------------------------------------+ |
這里告訴我們慢日志的日志存放位置,慢日志是否有開啟。
那么什么樣的查詢需要被日志呢?在MySQL中, 沒有index的查詢 以及 超過指定時間同時超過指定掃描行數的查詢 需要記錄在慢日志查詢里面。
那么它們的參數又是怎么查看的呢?
沒有index的查詢記錄開關
| mysql> show global variables like '%indexes%'; |
| +----------------------------------------+-------+| Variable_name | Value |+----------------------------------------+-------+| log_queries_not_using_indexes | OFF || log_throttle_queries_not_using_indexes | 0 |+----------------------------------------+-------+ |
第一個參數 表示是否開啟記錄沒有index的查詢,第二個
參數用來做日志記錄的流量控制,一分鐘可以記錄多少條,默認0是表示不限制。
超過指定時長的查詢開關
| mysql> show global variables like '%long_query%'; |
| +-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.00 sec) |