【體系結構】MySQL日志文件--慢查詢日志 顧名思義,慢查詢日志中記錄的是執行時間較長的 query 可以設一個閥值、將運行時間超過該值的所有SQL語句都記錄到慢查詢日志文件中 該閥值可以通過參數long_query_time來設置、默認是10秒 這裡需要一點、對於運行時間正好等於long_query_time的情況、並不會被記錄 因為、在源代碼裡是判斷大於long_query_time、而非大於等於 [plain] mysql> show variables like 'log_slow_queries'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | log_slow_queries | ON | +------------------+-------+ 1 row in set (0.00 sec) mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) 另一個和慢查詢日志相關的參數是log_queries_not_using_indexes 如果運行的SQL沒有使用索引、則MySQL同樣會將這條語句記錄到慢查詢日志文件 [plain] mysql> show variables like 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ 1 row in set (0.00 sec) 在這裡、我沒有開啟、但有點需要提醒、如果在線修改該參數、雖然沒有報錯、但是不會生效 MySQL 還提供了專門用來分析滿查詢日志的工具程序 mysqldumpslow、用來幫助MySQL DBA解決可能存在的性能問題 例子、獲得 TOP-5 SQL語句: [plain] [mysql@localhost bin]$ ./mysqldumpslow -s al -n 5 /home/mysql/mysql/log/slow.log Reading mysql slow query log from /home/mysql/mysql/log/slow.log Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts 更多用法、請咨詢 ./mysqldumpslow --help 從5.1.6版本開始,慢查詢日志即可以是個文件,也可以保存在數據庫中的指定表 參數log_output指定了慢查詢輸出的格式、默認為file、你也可以將它設為table 參數log_output是動態的、並且是全局的、我們能夠在線進行變更 [plain] mysql> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.00 sec) mysql> set global log_output='TABLE'; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | TABLE | +---------------+-------+ 1 row in set (0.00 sec) mysql> select sleep(15); +-----------+ | sleep(15) | +-----------+ | 0 | +-----------+ 1 row in set (15.02 sec) mysql> select * from mysql.slow_log\G; *************************** 1. row *************************** start_time: 2013-04-14 01:22:29 user_host: root[root] @ localhost [] query_time: 00:00:15 lock_time: 00:00:00 rows_sent: 1 rows_examined: 0 db: test last_insert_id: 0 insert_id: 0 server_id: 1 sql_text: select sleep(15) 1 row in set (0.00 sec) 在這個例子裡、我設置了睡眠15秒、那麼這句SQL就會被記錄到slow_log表 需要注意的是,慢查詢日志中有可能記錄到與用戶權限或密碼相關的語句,因此慢查詢日志文件的保存也要注意安全