MySQL 慢查詢?nèi)罩旧钊肜斫?/h1>
瀏覽:66日期:2023-10-03 17:31:26
什么是慢查詢?nèi)罩?p>MySQL的慢查詢?nèi)罩臼?MySQL提供的一種日志記錄,它用來(lái)記錄在 MySQL 中響應(yīng)時(shí)間超過(guò)閥值的語(yǔ)句,具體指運(yùn)行時(shí)間超過(guò)long_query_time 值的 SQL,則會(huì)被記錄到慢查詢?nèi)罩局?/p>具體指運(yùn)行時(shí)間超過(guò) long_query_time 值的 SQL,則會(huì)被記錄到慢查詢?nèi)罩局小ong_query_time 的默認(rèn)值為 10, 意思是運(yùn)行 10 秒以上的語(yǔ)句
由它來(lái)查看哪些 SQL 超出了我們的最大忍耐時(shí)間值,比如一條SQL執(zhí)行超過(guò) 5 秒鐘,我們就算慢 SQL,希望能收集超過(guò) 5 秒的SQL,結(jié)合之前explain進(jìn)行全面分析
默認(rèn)情況下,MySQL 數(shù)據(jù)庫(kù)沒(méi)有開(kāi)啟慢?搜?罩荊?枰?頤鞘侄?瓷柚謎飧霾問(wèn)?5比唬?綣?皇塹饔判枰?幕埃?話悴喚ㄒ櫧舳?貌問(wèn)??蛭??袈?檠?罩凈嶧蚨嗷蟶俅?匆歡ǖ男閱苡跋臁B?搜?罩局С紙?罩炯鍬夾慈胛募??/p>如何開(kāi)啟慢查詢
查看開(kāi)啟狀態(tài)
SHOW VARIABLES LIKE ’%slow_query_log%’
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
開(kāi)啟慢查詢
set global slow_query_log = 1
使用 set global_slow_query_log = 1 開(kāi)啟了慢查詢?nèi)罩局粚?duì)當(dāng)前數(shù)據(jù)庫(kù)生,如果 MYSQL 重啟后則會(huì)失效。
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
如果要永久生效,就必須修改配置文件 my.cnf(其它系統(tǒng)變量也是如此)修改 my.cnf 文件,[mysqld]下增加或修改參數(shù)
slow_query_log 和 slow_query_log_file 后,然后重啟 MySQL 服務(wù)器。也即將如下兩行配置進(jìn)my.cnf文件
slow_query_log =1slow_query_log_file=/var/lib/mysql/tim-slow.log
關(guān)于慢查詢的參數(shù) slow_query_log_fie,它指定慢查詢?nèi)罩疚募拇娣怕窂剑到y(tǒng)默認(rèn)會(huì)給一個(gè)缺省的文件host_name-slow.log(如果沒(méi)有指定參數(shù) slow_query_log_file的話)
那么開(kāi)啟慢查詢?nèi)罩竞螅裁礃拥腟QL參會(huì)記錄到慢查詢里面?
通過(guò) show variables like ‘long_query_time%’ 來(lái)查看默認(rèn)時(shí)間長(zhǎng)度,單位是秒:
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
同樣的,可以使用命令修改,也可以在my.cnf里面配置。假如運(yùn)行時(shí)間正好等于 long_query_time 的情況,并不會(huì)被記錄下來(lái)。也就是說(shuō),在MySQL源碼里是判斷大于 long_query_time,而非大于等于!
設(shè)置記錄的閾值:
set global long_query_time=3;
同樣的,可以使用命令修改,也可以在my.cnf里面配置。假如運(yùn)行時(shí)間正好等于 long_query_time 的情況,并不會(huì)被記錄下來(lái)。也就是說(shuō),在MySQL源碼里是判斷大于 long_query_time,而非大于等于!
設(shè)置記錄的閾值:
set global long_query_time=3;
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
設(shè)置了但是還是沒(méi)有發(fā)生更改?為什么?此時(shí)需要重新開(kāi)啟一個(gè)會(huì)話才可以:
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
接下來(lái)實(shí)行一個(gè)較慢的查詢,如下圖,但是記得要在配置文件中做如下配置:
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
接著去日志文件中查看存在哪些超過(guò)閾值的SQL就好了:
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
查詢當(dāng)前系統(tǒng)中有多少條慢查詢記錄:
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
記載一下我的配置文件
slow_query_log=1;slow_query_log_file=/var/lib/mysql/tim-slow.log;long_query_time=3;log_output=FILE日志分析工具mysqldumpshow
![MySQL 慢查詢?nèi)罩旧钊肜斫? src=]()
在生產(chǎn)環(huán)境中,如果要手工分析日志,查找、分析 SQL,顯然是個(gè)體力活,MYSQL 提供了日志分析工具mysqldumpshow
s:是表示按何種方式排序 c:訪問(wèn)次數(shù) l:鎖定時(shí)間 r:返回記錄 t:查詢時(shí)間 al:平均鎖定時(shí)間 ar:平均返回記錄數(shù) at:平均查詢時(shí)間 t:即為返回前面多少條的數(shù)據(jù) g:后邊搭配一個(gè)正則匹配模式,大小寫不敏感的 下面是使用示例:
得到返回記錄集最多的 10 個(gè) SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/tim-slowlog
得到訪問(wèn)次數(shù)最多的 10 個(gè) SQL
mysqldumpslow -s c-t 10 /var/lib/mysql/tim-slow log
得到按照時(shí)間排序的前 10 條里面含有左連接的查詢語(yǔ)句
mysqldumpslow -s t -t 10 -g 'left join' /var/lib/mysql/tim-slowlog
另外建議在使用這些命令時(shí)結(jié)合和 more 使用,否則有可能出現(xiàn)爆屏情?r
mysqldumpslow -s r -t 10 /var/lib/mysq/tim-slow.log | more
以上就是MySQL 慢查詢?nèi)罩旧钊肜斫獾脑敿?xì)內(nèi)容,更多關(guān)于MySQL 慢查詢?nèi)罩镜馁Y料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
標(biāo)簽:
MySQL
數(shù)據(jù)庫(kù)
相關(guān)文章:
1. 影響SQL server性能的關(guān)鍵三個(gè)方面 2. ORACLE回滾段表空間數(shù)據(jù)文件丟失或損壞處理方法3. DB2數(shù)據(jù)庫(kù)更新執(zhí)行計(jì)劃的幾個(gè)常見(jiàn)的方法4. 淺談MySQL之select優(yōu)化方案5. SQL Server 2000之日志傳送功能 - 描述6. Mysql查詢優(yōu)化之IN子查詢優(yōu)化方法詳解7. MySQL 性能、監(jiān)控與災(zāi)難恢復(fù)8. MySQL配置主從服務(wù)器(一主多從)9. 如何在SQL Server中恢復(fù)數(shù)據(jù)10. DB2 9的九大新特性
具體指運(yùn)行時(shí)間超過(guò) long_query_time 值的 SQL,則會(huì)被記錄到慢查詢?nèi)罩局小ong_query_time 的默認(rèn)值為 10, 意思是運(yùn)行 10 秒以上的語(yǔ)句
由它來(lái)查看哪些 SQL 超出了我們的最大忍耐時(shí)間值,比如一條SQL執(zhí)行超過(guò) 5 秒鐘,我們就算慢 SQL,希望能收集超過(guò) 5 秒的SQL,結(jié)合之前explain進(jìn)行全面分析
默認(rèn)情況下,MySQL 數(shù)據(jù)庫(kù)沒(méi)有開(kāi)啟慢?搜?罩荊?枰?頤鞘侄?瓷柚謎飧霾問(wèn)?5比唬?綣?皇塹饔判枰?幕埃?話悴喚ㄒ櫧舳?貌問(wèn)??蛭??袈?檠?罩凈嶧蚨嗷蟶俅?匆歡ǖ男閱苡跋臁B?搜?罩局С紙?罩炯鍬夾慈胛募??/p>如何開(kāi)啟慢查詢
查看開(kāi)啟狀態(tài)
SHOW VARIABLES LIKE ’%slow_query_log%’
開(kāi)啟慢查詢
set global slow_query_log = 1
使用 set global_slow_query_log = 1 開(kāi)啟了慢查詢?nèi)罩局粚?duì)當(dāng)前數(shù)據(jù)庫(kù)生,如果 MYSQL 重啟后則會(huì)失效。
如果要永久生效,就必須修改配置文件 my.cnf(其它系統(tǒng)變量也是如此)修改 my.cnf 文件,[mysqld]下增加或修改參數(shù)
slow_query_log 和 slow_query_log_file 后,然后重啟 MySQL 服務(wù)器。也即將如下兩行配置進(jìn)my.cnf文件
slow_query_log =1slow_query_log_file=/var/lib/mysql/tim-slow.log
關(guān)于慢查詢的參數(shù) slow_query_log_fie,它指定慢查詢?nèi)罩疚募拇娣怕窂剑到y(tǒng)默認(rèn)會(huì)給一個(gè)缺省的文件host_name-slow.log(如果沒(méi)有指定參數(shù) slow_query_log_file的話)
那么開(kāi)啟慢查詢?nèi)罩竞螅裁礃拥腟QL參會(huì)記錄到慢查詢里面?
通過(guò) show variables like ‘long_query_time%’ 來(lái)查看默認(rèn)時(shí)間長(zhǎng)度,單位是秒:
同樣的,可以使用命令修改,也可以在my.cnf里面配置。假如運(yùn)行時(shí)間正好等于 long_query_time 的情況,并不會(huì)被記錄下來(lái)。也就是說(shuō),在MySQL源碼里是判斷大于 long_query_time,而非大于等于!
設(shè)置記錄的閾值:
set global long_query_time=3;
同樣的,可以使用命令修改,也可以在my.cnf里面配置。假如運(yùn)行時(shí)間正好等于 long_query_time 的情況,并不會(huì)被記錄下來(lái)。也就是說(shuō),在MySQL源碼里是判斷大于 long_query_time,而非大于等于!
設(shè)置記錄的閾值:
set global long_query_time=3;
設(shè)置了但是還是沒(méi)有發(fā)生更改?為什么?此時(shí)需要重新開(kāi)啟一個(gè)會(huì)話才可以:
接下來(lái)實(shí)行一個(gè)較慢的查詢,如下圖,但是記得要在配置文件中做如下配置:
接著去日志文件中查看存在哪些超過(guò)閾值的SQL就好了:
查詢當(dāng)前系統(tǒng)中有多少條慢查詢記錄:
記載一下我的配置文件
slow_query_log=1;slow_query_log_file=/var/lib/mysql/tim-slow.log;long_query_time=3;log_output=FILE日志分析工具mysqldumpshow
在生產(chǎn)環(huán)境中,如果要手工分析日志,查找、分析 SQL,顯然是個(gè)體力活,MYSQL 提供了日志分析工具mysqldumpshow
s:是表示按何種方式排序 c:訪問(wèn)次數(shù) l:鎖定時(shí)間 r:返回記錄 t:查詢時(shí)間 al:平均鎖定時(shí)間 ar:平均返回記錄數(shù) at:平均查詢時(shí)間 t:即為返回前面多少條的數(shù)據(jù) g:后邊搭配一個(gè)正則匹配模式,大小寫不敏感的下面是使用示例:
得到返回記錄集最多的 10 個(gè) SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/tim-slowlog
得到訪問(wèn)次數(shù)最多的 10 個(gè) SQL
mysqldumpslow -s c-t 10 /var/lib/mysql/tim-slow log
得到按照時(shí)間排序的前 10 條里面含有左連接的查詢語(yǔ)句
mysqldumpslow -s t -t 10 -g 'left join' /var/lib/mysql/tim-slowlog
另外建議在使用這些命令時(shí)結(jié)合和 more 使用,否則有可能出現(xiàn)爆屏情?r
mysqldumpslow -s r -t 10 /var/lib/mysq/tim-slow.log | more
以上就是MySQL 慢查詢?nèi)罩旧钊肜斫獾脑敿?xì)內(nèi)容,更多關(guān)于MySQL 慢查詢?nèi)罩镜馁Y料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
