本篇文章帶大家了解一下mysql中的慢查詢,介紹一下啟用慢查詢日志,并分析慢查詢的方法,希望對大家有所幫助!
mysql有一項功能可以記錄長時間查詢的慢記錄,具體是多長時間可以自己配置,但是慢查詢也未必就是不良的SQL,也可能受其他查詢影響,或者是系統資源限制導致的,它也是我們常用的性能分析工具。【相關推薦:mysql視頻教程】
MySQL的慢查詢日志由long_query_time和min_examined_row_limit控制的,前者意思是如果查詢花費的時間超過這么多秒,MySQL服務器就是在啟用慢查詢日志的情況下,將這條記錄到慢查詢日志文件中。
啟用慢查詢日志
要在 MySQL 中啟用慢查詢日志,請按照下列步驟操作:
首先看看MySQL中關于慢查詢的狀態。
MariaDB?[(none)]>?show?variables?like?'%slow%'; +------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+??????????????????????????????????????????????????????????????????????????????????????????? |?Variable_name????????????????|?Value????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????|??????????????????????????????????????????????????????????????????????????????????????????? +------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+??????????????????????????????????????????????????????????????????????????????????????????? |?log_slow_admin_statements????|?ON???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?log_slow_disabled_statements?|?sp???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?log_slow_filter??????????????|?admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk?| |?log_slow_rate_limit??????????|?1????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?log_slow_slave_statements????|?ON???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?log_slow_verbosity???????????|??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?slow_launch_time?????????????|?2????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?slow_query_log???????????????|?OFF??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| |?slow_query_log_file??????????|?hxl-slow.log?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| +------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+ 9?rows?in?set?(0.001?sec)
首先看slow_query_log的狀態,他代表慢查詢日志是否開啟。該值可以是0或OFF表示禁用,1或ON表示啟用。日志輸出的目的地由log_output系統變量控制,如果該值為NONE,則即使啟用了慢查詢日志,也不會寫入到日志中,log_output變量的取值如下:
- TABLE:?(默認)向mysql.general_log表寫入一般查詢,向表mysql.slow_log寫入慢速查詢?。
- FILE:將一般和慢速查詢日志寫入文件系統。
- NONE?– 禁用日志記錄。
還有general_log_file與slow_query_log_file?變量代表查詢日志和慢查詢日志文件的名稱。可以在服務器啟動或運行時設置這些變量。
啟動慢查詢日志
MySQL中默認關閉了慢查詢日志功能,因此要打開此功能,我們需要將slow_query_log設置為ON,如下所示。
SET?GLOBAL?slow_query_log?=?1;
設置記錄時長
long_query_time變量表示只有運行時間超過此值就會被記錄,如下所示,更改時間為5秒,他默認為10秒,最小值為 0。
SET?GLOBAL?long_query_time?=?5;
修改輸出位置
默認情況下,慢查詢日志文件位于 /var/lib/mysql/hostname-slow.log,我們還可以使用slow_query_log_file變量設置另一個位置。
SET?GLOBAL?slow_query_log_file?=?'/var/log/mysql/mysql-slow.log';
將慢查詢日志寫入表
慢查詢日志也可以被寫入slow_log表中,方式就是上述中所說修改log_output系統變量為TABLE,操作如下:
SET?GLOBAL?log_output='TABLE';
慢查詢日志相關的變量
- mysql視頻教程?– 啟用/禁用慢查詢日志
- mysql視頻教程?– 如何寫入輸出
- mysql視頻教程?– 慢查詢日志文件的名稱
- mysql視頻教程?– 定義慢查詢的時間(以秒/微秒為單位)
- mysql視頻教程?– 是否記錄不使用索引的查詢
- mysql視頻教程?– 是否記錄某些管理語句
- mysql視頻教程?– 不應記錄在慢查詢日志中的語句類型
- mysql視頻教程?– 查詢必須檢查的最小行數才能變慢
- mysql視頻教程?– 允許記錄一部分慢查詢
- mysql視頻教程?– 日志中的詳細信息量
- mysql視頻教程?– 限制要記錄的查詢
分析慢查詢
日志記錄后,我們還需要分析這些日志,找出影響系統的查詢,MySQL提供了一個名為mysqldumpslow的工具,可以簡單的顯示結果,只需要把日志路徑傳遞給他即可,如下:
#?mysqldumpslow?-a?mysql-slow.log Reading?mysql?slow?query?log?from?mysql-slow.log count:?1??Time=0.00s?(0s)??Lock=0.00s?(0s)??Rows_sent=21.0?(21),?Rows_examined=21.0?(21),?Rows_affected=0.0?(0),?root[root]@localhost ??show?databases Count:?1??Time=0.00s?(0s)??Lock=0.00s?(0s)??Rows_sent=2.0?(2),?Rows_examined=2.0?(2),?Rows_affected=0.0?(0),?root[root]@localhost ??select?*?from?users Count:?1??Time=0.00s?(0s)??Lock=0.00s?(0s)??Rows_sent=1.0?(1),?Rows_examined=0.0?(0),?Rows_affected=0.0?(0),?root[root]@localhost ??select?@@version_comment?limit?1 Count:?1??Time=0.00s?(0s)??Lock=0.00s?(0s)??Rows_sent=1.0?(1),?Rows_examined=0.0?(0),?Rows_affected=0.0?(0),?root[root]@localhost
他的參數如下
-
-s ,按照什么方式起來排序。默認at,也就是按照平均查詢時間來排序。都是按照倒序排列。
al: average lock time 平均鎖定時間
ar: average rows sent 平均返回行數
at: average query time 平均查詢時間
c: count 總執行次數
l: lock time 總鎖定時間
r: rows sent 總返回行數
t: query time 總查詢時間
-
-t ,show the top n queries,顯示前多少名的記錄
-
-a ,默認不開啟這個選項。mysqldumpslow將相似的SQL的值(字符串或者數字)替換為N,開啟該選項,則顯示真實值。不開啟該選項,有點類似于oracle的綁定變量的記錄。
-
-g ,類似于grep命令,過濾出需要的信息。如,只查詢A表的慢查詢記錄。
-
-l ,總時間中包含鎖定時間
原文地址:https://juejin.cn/post/6993221989175394311
更多編程相關知識,請訪問:mysql視頻教程!!