本篇文章主要記述Mysql慢查詢
的學(xué)習(xí)過程甘耿,內(nèi)容目錄如下:
慢查詢?nèi)罩臼鞘裁矗?br>
慢查詢?nèi)罩鹃_啟和配置
慢查詢?nèi)罩鞠嚓P(guān)操作
慢查詢?nèi)罩臼鞘裁矗?/h2>
Mysql的慢查詢?nèi)罩臼荕ysql提供的一種日志記錄霹娄,用來記錄在Mysql中響應(yīng)時間超過閾值的語句瞎饲,具體所指運行時間超過long_query_time
值的SQL物舒,則會被記錄在慢查詢?nèi)罩局小?/p>
慢查詢?nèi)罩鹃_啟和配置
1.慢查詢?nèi)罩灸J是關(guān)閉的卦洽,可以通過如下的命令查看是否開啟
:
mysql> show variables like 'slow_query_log%';
+---------------------+-------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /home/mysql/data/localhost-slow.log |
+---------------------+-------------------------------------+
2 rows in set (0.00 sec)
OFF
表示是處于關(guān)閉狀態(tài),如果是開啟狀態(tài)就會是ON
2.開啟
慢查詢
臨時開啟
set global slow_query_log = 1;
使用set global slow_query_log = 1;
開啟了慢查詢?nèi)罩境跃侵?code>對當前數(shù)據(jù)庫生效,如果Mysql重啟則會失效糕篇,如果要永久生效,就必須修改配置文件my.cnf
酌心。
永久開啟
將如下的兩行配置進my.cnf文件:
slow_query_log=1
slow_query_log_file=/home/mysql/data/localhost-slow.log
然后重啟Mysql服務(wù)器拌消。
關(guān)于慢查詢的參數(shù)slow_query_log_file
,它指定慢查詢?nèi)罩疚募拇娣怕窂剑到y(tǒng)默認會給一個缺省的文件host_name-slow.log
(即如果我們開啟了慢查詢但是沒有配置這個參數(shù)的話谒府,那么就是用默認缺省的文件拼坎,有配過就是用我們配置的參數(shù))
3.修改慢查詢閾值
參數(shù)long_query_time
用來控制執(zhí)行時間超過多少會被記錄進入滿插入日志浮毯。默認情況下long_query_time的值為10秒
完疫。可以使用如下的命令查詢和修改:
show variables like '%long_query_time';
set global long_query_time=3;
修改完之后我再執(zhí)行show variables like '%long_query_time';
發(fā)現(xiàn)還是10秒债蓝。
為什么設(shè)置后看不出變化壳鹤?
其實是已經(jīng)改變了,我們有兩種方法可以看到修改過后的值:
- 需要重新連接獲取開一個新的會話才能看到修改值饰迹。
- 使用show
global
variables like '%long_query_time';
ps:關(guān)于long_query_time
,在mysql源碼中是判斷大于此值芳誓,而非大于等于
,配置10秒,那么等于10秒的sql就不會被記錄
慢查詢?nèi)罩鞠嚓P(guān)操作
模擬慢查詢語句
如果是自己在學(xué)習(xí)階段可以通過select sleep(4);
來模擬慢查詢操作啊鸭。因為我的這臺服務(wù)器上有現(xiàn)成的慢查詢?nèi)罩厩绿剩院竺娴姆治鼍突诖巳罩尽?/p>
獲取有多少條慢查詢?nèi)罩荆?/h3>
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 24209 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 24209 |
+---------------+-------+
1 row in set (0.00 sec)
如上面的查詢結(jié)果,我的這臺服務(wù)器上面有生產(chǎn)環(huán)境中記錄24209條慢查詢?nèi)罩驹疲@么多如果喲啊手工分析日志赂摆,查找、分析sql钟些,顯然不太高效烟号。Mysql提供了日志分析工具mysqldumpslow
,接下來我們就來看看這個工具政恍。
mysqldumpslow
可以通過mysqldumpslow --help
來查看此命令的幫助信息汪拥,當然這個命令和mysqldump
類似不需要登錄mysql。
詳細看看此命令的常用參數(shù)
-s:表示按照什么方式排序篙耗,-s后面可以追加的排序方式如下迫筑,默認是降序:
c:訪問次數(shù)
l:鎖定時間
r:返回記錄
t:查詢時間
al:平均鎖定時間
ar:平均返回記錄數(shù)
at:平均查詢時間
-t :即為返回前面多少條的數(shù)據(jù)宪赶,后面跟一個整數(shù)
-g:后面搭配一個正則匹配模式,大小寫不敏感的脯燃;
工作常用參考
#返回訪問次數(shù)最多的10條SQL逊朽,也就是被記錄最多的10條SQL
mysqldumpslow -s c -t 10 /home/mysql/data/localhost-slow.log
#得到按照時間排序的前5條里面含有左連接的查詢語句
mysqldumpslow -s t -t 5 -g "left join" /home/mysql/data/localhost-slow.log