Mysql 基礎學習(二十)-- 慢查詢日誌

慢查詢日誌

Mysql的慢查詢日誌是Mysql 提供的一種日誌記錄,它用來記錄在Mysql中響應時間超過 閾值 的語句,具體指運行時間超過 long_query_time 值得SQL,則會被記錄到慢查詢日誌中,long_query_time得默認值爲10,意思是運行 10 秒以上得語句,比如一條 SQL 執行超過 10 秒鐘,我們就算慢SQL,收集超過10 秒以上的 SQL, 結合之前 explain 進行全面分析。

默認情況下,MySQL得數據庫沒有開啓慢查詢日誌,需要我們手動來設置該參數,需要我們手動來設置這個參數, 當然,如果不是調優需要的話,一般不建議開啓該參數,因爲開啓慢查詢之後,會或多或少得帶來一定的性能影響。慢查詢日誌 支持將日誌記錄寫入文件

查看是否開啓以及如何開啓
# 查看語句
SHOW VARIABLES LIKE "%slow_query_log%";
+---------------------+-----------------+
| Variable_name       | Value           |
+---------------------+-----------------+
| slow_query_log      | ON              |
| slow_query_log_file | GSSZNB-slow.log |
+---------------------+-----------------+

開啓 慢查詢日誌

SET GLOBAL slow_query_log = 1;

開啓之後只對當前數據庫有效,重啓數據庫之後,就會恢復默認。

關閉慢查詢日誌

SET GLOBAL slow_query_log = 0

如果想要永久性 修改,那麼修改配置文件 my.cnf 在 [mysqld] 下增加或者修改參數

slow_query_log=1
slow_query_log_file=/var/lib/mysql/log/gssznb-slow.log

如果慢查詢的參數 slow_query_log_file , 它指定慢查詢日誌文件得存放路徑,系統會給一個默認得缺省文件 host_name-slow.log(如果沒有指定參數得slow_query_log_file的話)

開啓了慢查詢日誌之後,什麼樣的SQL,纔會記錄到慢查詢日誌記錄中呢

這個是由參數 long_query_time 控制,默認情況下 long_query_time 的值爲 10秒

查看 參數 long_query_time 值

show variables like "long_query_time%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)

假如運行時間剛好等於 long_query_time的時間,是不會被記錄下來的。只有大於 long_query_time. 並非 大於等於

設置慢的 閾值 時間

SET GLOBAL long_query_time = 3;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "long_query_time%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)
# 重新設置閾值之後查看這之後還是 10s 。
# 只有重新連接或者新開一個繪畫才能夠看到修改值
# 重新創建一個連接
mysql -uroot -proot

 show variables LIKE "%long_query_time%";
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
1 row in set, 1 warning (0.00 sec)

# 這個時候發現 long_query_time 的值 變爲了 3

開啓了慢查詢日誌之後,模擬一個慢查詢SQL,然後查看慢查詢日誌


show variables like "%slow%";
+---------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name       | Value                                                                                                        |
+---------------------+--------------------------------------------------------------------------------------------------------------+
| log_slow_filter     | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
| log_slow_queries    | ON                                                                                                           |
| log_slow_rate_limit | 1                                                                                                            |
| log_slow_verbosity  |                                                                                                              |
| slow_launch_time    | 2                                                                                                            |
| slow_query_log      | ON                                                                                                           |
| slow_query_log_file | VM_0_11_centos-slow.log                                                                                      |
+---------------------+--------------------------------------------------------------------------------------------------------------+
# VM_0_11_centos-slow.log 是慢查詢日誌文件名
# 模擬慢查詢SQL
SELECT SLEEP(15);
# 進入到  /var/lib/mysql/
# 找到日誌文件並查看
[root@VM_0_11_centos mysql]# cat VM_0_11_centos-slow.log
/usr/libexec/mysqld, Version: 5.5.60-MariaDB (MariaDB Server). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 191009 14:00:39
# User@Host: root[root] @ localhost []
# Thread_id: 71919  Schema:   QC_hit: No
# Query_time: 15.008155  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0 
SET timestamp=1570600839;   
select sleep(15); # 對應的SQL語句

想要永久性生效,修改 mysqld 下配置

slow_query_log=1;
slow_query_log_file=/var/lib/mysql/gss-slow.log;
log_query_time=3;
log_output=FILE;
使用 mysqldumpslow 慢查詢日誌分析工具
# 得到返回記錄中最多的 10 個SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
# 得到訪問次數最多的10個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log
# 得到時間排序的前10條裏面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log
# 建議與more 命令一起使用,
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章