MySql定位執行效率較低的SQL語句

denglt發表於2014-02-17

MySql定位執行效率較低的SQL語句:

MySQL能夠記錄執行時間超過引數 long_query_time 設定值的SQL語句,預設是不記錄的。

獲得初始鎖定的時間不算作執行時間。mysqld在SQL執行完和所有的鎖都被釋放後才寫入日誌。且記錄順序可能不同於執行順序。

5.1.6以前mysql使用--log-slow-queries[=file_name]來開啟記錄慢的SQL。

MySQL 5.1.6:日誌可以記錄在檔案或是表中,由引數e --log-output來指定日誌的目標型別。

MySQL5.1.12: 使用 --slow_query_log[={0|1}]代替log-slow-queries,一個預設日誌檔案被使用

MySQL5.1.29: 使用slow_query_log[={0|1}]控制日誌啟用,slow_query_log_file=file_name指定日誌檔案。log-slow-queries引數棄用。


預設:管理語句和沒有使用index的查詢將不記錄。可以通過  --log-slow-admin-statements 和 log_queries_not_using_indexes來設定是否記錄。

管理語句包括: ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,  REPAIR TABLE.

如果設定了log_queries_not_using_indexes,可能引起日誌檔案快速增長,可以考慮使用引數log_throttle_queries_not_using_indexes 設定每分鐘記錄能夠記錄的數量。


預設:一個複製從庫不會記錄複製查詢的日誌。為了改變這個,可以使用引數--log-slow-slave-statements

直接檢視慢查詢日誌檔案是一項艱鉅的任務,我們可以使用mysqldumpslow工具來輔助。 Section 4.6.8, “mysqldumpslow — Summarize Slow Query Log Files”.


另外:慢查詢日誌是在查詢結束後才記錄,故正在執行的慢SQL並不能被定位到,可以使用show processlist命令檢視當前MySQL在進行的執行緒,包括執行緒的狀態、是否鎖表等等,可以實時地檢視SQL的執行情況。

參考:
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
http://dev.mysql.com/doc/refman/5.6/en/slow-query-log.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-1082666/,如需轉載,請註明出處,否則將追究法律責任。

相關文章