MySQL慢查詢?nèi)绾味ㄎ辉斀?/h1>
更新時間:2020年11月24日 12:02:28 作者:武培軒
這篇文章主要給大家介紹了關(guān)于MySQL慢查詢?nèi)绾味ㄎ坏南嚓P(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
前言
相信大家在平時工作中都有過 SQL 優(yōu)化經(jīng)歷,那么在優(yōu)化前就必須找到慢 SQL 方可進(jìn)行分析。這篇文章就介紹下如何定位到慢查詢。
慢查詢?nèi)罩臼?MySQL 內(nèi)置的一項功能,可以記錄執(zhí)行超過指定時間的 SQL 語句。
以下是慢查詢的相關(guān)參數(shù),大家感興趣的可以看下:
參數(shù)
含義
log_output
日志輸出位置,默認(rèn)為 FILE,即保存為文件,若設(shè)置為 TABLE,則將日志記錄到 mysql.show_log 表中,支持設(shè)置多種格式
slow_query_log_file
指定慢查詢?nèi)罩疚募穆窂胶兔?,可使用絕對路徑指定,默認(rèn)值是主機(jī)名-slow.log,位于配置的 datadir 目錄
long_query_time
執(zhí)行時間超過該值才記錄到慢查詢?nèi)罩?,單位為秒,默認(rèn)為 10
min_examined_row_limit
對于查詢掃描行數(shù)小于此參數(shù)的SQL,將不會記錄到慢查詢?nèi)罩局?,默認(rèn)為 0
log_queries_not_using_indexes
是否將未使用索引的 SQL 記錄到慢查詢?nèi)罩局?,開啟此配置后會無視 long_query_time 參數(shù),默認(rèn)為 OFF
log_throttle_queries_not_using_indexes
設(shè)定每分鐘記錄到日志的未使用索引的語句數(shù)目,超過這個數(shù)目后只記錄語句數(shù)量和花費(fèi)的總時間,默認(rèn)為 0
log-slow-admin-statements
記錄執(zhí)行緩慢的管理 SQL,如 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE,默認(rèn)為 OFF
log_slow_slave_statements
記錄從庫上執(zhí)行的慢查詢語句,如果 binlog 的值為 row,則失效,默認(rèn)為 OFF
開啟慢查詢
有兩種方式可以開啟慢查詢
- 修改配置文件
- 設(shè)置全局變量
方式一需要修改配置文件 my.ini,在[mysqld]段落中加入如下參數(shù):
[mysqld]
log_output='FILE,TABLE'
slow_query_log='ON'
long_query_time=0.001
然后需要重啟 MySQL 才可以生效,命令為 service mysqld restart
方式二無需重啟即可生效,但是重啟會導(dǎo)致設(shè)置失效,設(shè)置的命令如下所示:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL log_output = 'FILE,TABLE';
SET GLOBAL long_query_time = 0.001;
這樣就可以將慢查詢?nèi)罩就瑫r記錄在文件以及 mysql.slow_log 表中。
通過第二種方式開啟慢查詢?nèi)罩?,然后使用全表查詢語句 SELECT * FROM user
然后再查詢慢查詢?nèi)罩荆?code>SELECT * FROM mysql.slow_log,可以發(fā)現(xiàn)其中有這樣一條記錄:

slow_log
其中,start_time 為執(zhí)行時間,user_host 為用戶的主機(jī)名,query_time 為查詢所花費(fèi)的時間,lock_time 為該查詢使用鎖的時間,rows_sent 為這條查詢返回了多少數(shù)據(jù)給客戶端,rows_examined 表示這條語句掃描了多少行,db 為數(shù)據(jù)庫,sql_text 為這條 SQL,thread_id 為執(zhí)行這條查詢的線程 id。
這樣我們就可以通過 slow_log 表的數(shù)據(jù)進(jìn)行分析,然后對 SQL 進(jìn)行調(diào)優(yōu)了。
以上是通過 Table 來進(jìn)行分析的,下面來通過文件的慢查詢是怎么樣的。
如果不知道文件保存在哪里,可以使用 SHOW VARIABLES LIKE '%slow_query_log_file%'
來查看文件保存位置,打開慢查詢?nèi)罩疚募?,可以看出每五行表示一個慢 SQL,這樣查看比較費(fèi)事,可以使用一些工具來查看。

慢查詢?nèi)罩疚募?/p>
mysqldumpslow
MySQL 內(nèi)置了 mysqldumpslow 這個工具來幫助我們分析慢查詢?nèi)罩疚募?,Windows 環(huán)境下使用該工具需要安裝 Perl 環(huán)境。
可以通過 -help 來查看它的命令參數(shù):

mysqldumpslow help
比如我們可以通過 mysqldumpslow -s t 10 LAPTOP-8817LKVE-slow.log
命令得到按照查詢時間排序的 10 條 SQL 。

mysqldumpslow 結(jié)果
pt-query-digest
除此之外還有 pt-query-digest,這個是 Percona Toolkit 中的工具之一,下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/,如果是 Windows 系統(tǒng),可以在安裝 Perl 的環(huán)境下,把腳本下載下來:https://raw.githubusercontent.com/percona/percona-toolkit/3.x/bin/pt-query-digest
下面先對 pt-query-digest 進(jìn)行簡單的介紹:
pt-query-digest 是用于分析 MySQL 慢查詢的一個第三方工具,可以分析 binlog、General log 和 slowlog,也可以通過 showprocesslist 或者通過 tcpdump 抓取的 MySQL 協(xié)議數(shù)據(jù)來進(jìn)行分析,可以把分析結(jié)果輸出到文件中,分析過程是先對查詢語句的條件進(jìn)行參數(shù)化,然后對參數(shù)化以后的查詢進(jìn)行分組統(tǒng)計,統(tǒng)計出各查詢的執(zhí)行時間、次數(shù)、占比等,可以借助分析結(jié)果找出問題進(jìn)行優(yōu)化。
有興趣的可以先下載下來自己玩玩,將在后續(xù)的文章中對 pt-query-digest 工具進(jìn)行詳細(xì)介紹。
show processlist
還有種情況是慢查詢還在執(zhí)行中,慢查詢?nèi)罩纠锸钦也坏铰?SQL 呢,這個時候可以用 show processlist 命令來尋找慢查詢,該命令可以顯示正在運(yùn)行的線程,執(zhí)行結(jié)果如下圖所示,可以根據(jù) Time 的大小來判斷是否為慢查詢。

show processlist
總結(jié)
這篇文章主要講解了如何定位慢查詢以及簡單介紹了 mysqldumpslow 和 pt-query-digest 工具,后續(xù)還會講解 explain 和 show profile 以及 trace 等常用的方法。
你在定位慢查詢或者優(yōu)化 SQL 時,都會用到哪些方法呢?
到此這篇關(guān)于MySQL慢查詢?nèi)绾味ㄎ坏奈恼戮徒榻B到這了,更多相關(guān)MySQL慢查詢定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
參考文檔
https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
相關(guān)文章
-
教你解決往mysql數(shù)據(jù)庫中存入漢字報錯的方法
這篇文章主要介紹了Mysql基礎(chǔ)之教你解決往數(shù)據(jù)庫中存入漢字報錯的方法,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)mysql的小伙伴們有非常好的幫助,需要的朋友可以參考下 2021-05-05
-
MySQL InnoDB 鎖的相關(guān)總結(jié)
這篇文章主要介紹了MySQL InnoDB 鎖的相關(guān)知識總結(jié),幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下 2021-02-02
-
分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題
這篇文章主要介紹了分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題,文中提到了獨(dú)立索引所帶來的巨大CPU負(fù)擔(dān),以提醒在MySQL中使用索引要注意CPU負(fù)載的問題,需要的朋友可以參考下 2015-05-05
-
CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下 2020-11-11
-
Mysql存儲引擎InnoDB和Myisam的六大區(qū)別
這篇文章主要介紹了Mysql存儲引擎InnoDB和Myisam的六大區(qū)別,本文從構(gòu)成上、事務(wù)處理、SQL操作、自動ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下 2015-02-02
最新評論
前言
相信大家在平時工作中都有過 SQL 優(yōu)化經(jīng)歷,那么在優(yōu)化前就必須找到慢 SQL 方可進(jìn)行分析。這篇文章就介紹下如何定位到慢查詢。
慢查詢?nèi)罩臼?MySQL 內(nèi)置的一項功能,可以記錄執(zhí)行超過指定時間的 SQL 語句。
以下是慢查詢的相關(guān)參數(shù),大家感興趣的可以看下:
參數(shù) | 含義 |
---|---|
log_output | 日志輸出位置,默認(rèn)為 FILE,即保存為文件,若設(shè)置為 TABLE,則將日志記錄到 mysql.show_log 表中,支持設(shè)置多種格式 |
slow_query_log_file | 指定慢查詢?nèi)罩疚募穆窂胶兔?,可使用絕對路徑指定,默認(rèn)值是主機(jī)名-slow.log,位于配置的 datadir 目錄 |
long_query_time | 執(zhí)行時間超過該值才記錄到慢查詢?nèi)罩?,單位為秒,默認(rèn)為 10 |
min_examined_row_limit | 對于查詢掃描行數(shù)小于此參數(shù)的SQL,將不會記錄到慢查詢?nèi)罩局?,默認(rèn)為 0 |
log_queries_not_using_indexes | 是否將未使用索引的 SQL 記錄到慢查詢?nèi)罩局?,開啟此配置后會無視 long_query_time 參數(shù),默認(rèn)為 OFF |
log_throttle_queries_not_using_indexes | 設(shè)定每分鐘記錄到日志的未使用索引的語句數(shù)目,超過這個數(shù)目后只記錄語句數(shù)量和花費(fèi)的總時間,默認(rèn)為 0 |
log-slow-admin-statements | 記錄執(zhí)行緩慢的管理 SQL,如 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE,默認(rèn)為 OFF |
log_slow_slave_statements | 記錄從庫上執(zhí)行的慢查詢語句,如果 binlog 的值為 row,則失效,默認(rèn)為 OFF |
開啟慢查詢
有兩種方式可以開啟慢查詢
- 修改配置文件
- 設(shè)置全局變量
方式一需要修改配置文件 my.ini,在[mysqld]段落中加入如下參數(shù):
[mysqld] log_output='FILE,TABLE' slow_query_log='ON' long_query_time=0.001
然后需要重啟 MySQL 才可以生效,命令為 service mysqld restart
方式二無需重啟即可生效,但是重啟會導(dǎo)致設(shè)置失效,設(shè)置的命令如下所示:
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL log_output = 'FILE,TABLE'; SET GLOBAL long_query_time = 0.001;
這樣就可以將慢查詢?nèi)罩就瑫r記錄在文件以及 mysql.slow_log 表中。
通過第二種方式開啟慢查詢?nèi)罩?,然后使用全表查詢語句 SELECT * FROM user
然后再查詢慢查詢?nèi)罩荆?code>SELECT * FROM mysql.slow_log,可以發(fā)現(xiàn)其中有這樣一條記錄:
slow_log
其中,start_time 為執(zhí)行時間,user_host 為用戶的主機(jī)名,query_time 為查詢所花費(fèi)的時間,lock_time 為該查詢使用鎖的時間,rows_sent 為這條查詢返回了多少數(shù)據(jù)給客戶端,rows_examined 表示這條語句掃描了多少行,db 為數(shù)據(jù)庫,sql_text 為這條 SQL,thread_id 為執(zhí)行這條查詢的線程 id。
這樣我們就可以通過 slow_log 表的數(shù)據(jù)進(jìn)行分析,然后對 SQL 進(jìn)行調(diào)優(yōu)了。
以上是通過 Table 來進(jìn)行分析的,下面來通過文件的慢查詢是怎么樣的。
如果不知道文件保存在哪里,可以使用 SHOW VARIABLES LIKE '%slow_query_log_file%'
來查看文件保存位置,打開慢查詢?nèi)罩疚募?,可以看出每五行表示一個慢 SQL,這樣查看比較費(fèi)事,可以使用一些工具來查看。
慢查詢?nèi)罩疚募?/p>
mysqldumpslow
MySQL 內(nèi)置了 mysqldumpslow 這個工具來幫助我們分析慢查詢?nèi)罩疚募?,Windows 環(huán)境下使用該工具需要安裝 Perl 環(huán)境。
可以通過 -help 來查看它的命令參數(shù):
mysqldumpslow help
比如我們可以通過 mysqldumpslow -s t 10 LAPTOP-8817LKVE-slow.log
命令得到按照查詢時間排序的 10 條 SQL 。
mysqldumpslow 結(jié)果
pt-query-digest
除此之外還有 pt-query-digest,這個是 Percona Toolkit 中的工具之一,下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/,如果是 Windows 系統(tǒng),可以在安裝 Perl 的環(huán)境下,把腳本下載下來:https://raw.githubusercontent.com/percona/percona-toolkit/3.x/bin/pt-query-digest
下面先對 pt-query-digest 進(jìn)行簡單的介紹:
pt-query-digest 是用于分析 MySQL 慢查詢的一個第三方工具,可以分析 binlog、General log 和 slowlog,也可以通過 showprocesslist 或者通過 tcpdump 抓取的 MySQL 協(xié)議數(shù)據(jù)來進(jìn)行分析,可以把分析結(jié)果輸出到文件中,分析過程是先對查詢語句的條件進(jìn)行參數(shù)化,然后對參數(shù)化以后的查詢進(jìn)行分組統(tǒng)計,統(tǒng)計出各查詢的執(zhí)行時間、次數(shù)、占比等,可以借助分析結(jié)果找出問題進(jìn)行優(yōu)化。
有興趣的可以先下載下來自己玩玩,將在后續(xù)的文章中對 pt-query-digest 工具進(jìn)行詳細(xì)介紹。
show processlist
還有種情況是慢查詢還在執(zhí)行中,慢查詢?nèi)罩纠锸钦也坏铰?SQL 呢,這個時候可以用 show processlist 命令來尋找慢查詢,該命令可以顯示正在運(yùn)行的線程,執(zhí)行結(jié)果如下圖所示,可以根據(jù) Time 的大小來判斷是否為慢查詢。
show processlist
總結(jié)
這篇文章主要講解了如何定位慢查詢以及簡單介紹了 mysqldumpslow 和 pt-query-digest 工具,后續(xù)還會講解 explain 和 show profile 以及 trace 等常用的方法。
你在定位慢查詢或者優(yōu)化 SQL 時,都會用到哪些方法呢?
到此這篇關(guān)于MySQL慢查詢?nèi)绾味ㄎ坏奈恼戮徒榻B到這了,更多相關(guān)MySQL慢查詢定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
參考文檔
https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
相關(guān)文章
教你解決往mysql數(shù)據(jù)庫中存入漢字報錯的方法
這篇文章主要介紹了Mysql基礎(chǔ)之教你解決往數(shù)據(jù)庫中存入漢字報錯的方法,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)mysql的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05MySQL InnoDB 鎖的相關(guān)總結(jié)
這篇文章主要介紹了MySQL InnoDB 鎖的相關(guān)知識總結(jié),幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2021-02-02分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題
這篇文章主要介紹了分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題,文中提到了獨(dú)立索引所帶來的巨大CPU負(fù)擔(dān),以提醒在MySQL中使用索引要注意CPU負(fù)載的問題,需要的朋友可以參考下2015-05-05CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CenOS6.7下mysql 8.0.22 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11Mysql存儲引擎InnoDB和Myisam的六大區(qū)別
這篇文章主要介紹了Mysql存儲引擎InnoDB和Myisam的六大區(qū)別,本文從構(gòu)成上、事務(wù)處理、SQL操作、自動ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下2015-02-02