MySQL之慢查詢(xún)?nèi)罩?/h2>

序言: 很多人談到SQL優(yōu)化都頭頭是道,建索引,explain分析,like全模糊會(huì)導(dǎo)致索引失效 云云,于是我想問(wèn):優(yōu)化之前,需要找出數(shù)據(jù)庫(kù)中比如超過(guò)2s的慢SQL,你是怎么找的?很多人答不上來(lái),要是找都找不到,怎么去優(yōu)化呢,一個(gè)中大型系統(tǒng)可能成千上萬(wàn)條SQL都不過(guò)分,難道要一個(gè)個(gè)去分析么。

所以今天和大家聊聊慢SQL的挖掘機(jī)-慢查詢(xún)?nèi)罩?/b>

慢查詢(xún)?nèi)罩?/b>

MySQL的慢查詢(xún)?nèi)罩臼荕ySQL提供的一種日志記錄,它用來(lái)記錄在MySQL中響應(yīng)時(shí)間超過(guò)閥值的語(yǔ)句,具體指運(yùn)行時(shí)間超過(guò)long_query_time值的SQL,則會(huì)被記錄到慢查詢(xún)?nèi)罩局小?/p>

當(dāng)然,如果不是調(diào)優(yōu)需要的話(huà),一般不建議啟動(dòng)該參數(shù),因?yàn)殚_(kāi)啟慢查詢(xún)?nèi)罩緯?huì)或多或少帶來(lái)一定的性能影響。


1. 慢查詢(xún)?nèi)罩鹃_(kāi)啟

查看是否開(kāi)啟:show variables like '%slow_query_log%';

開(kāi)啟慢查詢(xún)?nèi)罩荆?/b>set global slow_query_log=1; (重啟會(huì)失效)


開(kāi)啟了慢查詢(xún)?nèi)罩竞?,什么樣的SQL才會(huì)記錄到查詢(xún)?nèi)罩纠锩妫?/p>

這個(gè)是由參數(shù)long_query_time控制,默認(rèn)情況下long_query_time的值為10秒

查看命令:show variables like 'long_query_time%';


注: 永久設(shè)置慢查詢(xún)?nèi)罩鹃_(kāi)啟,以及設(shè)置慢查詢(xún)?nèi)罩緯r(shí)間臨界點(diǎn)(不建議)

linux中,mysql配置文件一般默認(rèn)在 /etc/my.cnf 更改對(duì)應(yīng)參數(shù)即可


2. 慢查詢(xún)?nèi)罩驹O(shè)置與查看

設(shè)置閥值命令:set global long_query_time=3 (修改為閥值到3秒鐘的就是慢sql)


為什么設(shè)置后看不出變化:

需要重新連接或新開(kāi)一個(gè)會(huì)話(huà)才能看到修改值。 show variables like 'long_query_time%';

直接 show global variables like 'long_query_time';


查看慢查詢(xún)?nèi)罩荆?/b>

cat -n /data/mysql/mysql-slow.log

從慢查詢(xún)?nèi)罩局校覀兛梢钥吹矫恳粭l查詢(xún)時(shí)間高于3s 的sql語(yǔ)句,并可以看到執(zhí)行的時(shí)間是多少。

比如上面,就表示 sql語(yǔ)句??select * from comic where comic_id < 1952000;?執(zhí)行時(shí)間為3.902864秒,超出了我們?cè)O(shè)置的慢查詢(xún)時(shí)間臨界點(diǎn)3s,所以被記錄下來(lái)了


查看有多少條慢查詢(xún)記錄:show global status like '%Slow_queries%';

3.日志分析工具mysqldumpslow

在生產(chǎn)環(huán)境中,如果要手工分析日志,查找、分析SQL,顯然是個(gè)體力活,MySQL提供了日志分析工具mysqldumpslow

s: 是表示按照何種方式排序

c: 訪問(wèn)次數(shù)

l: 鎖定時(shí)間

r: 返回記錄

t: 查詢(xún)時(shí)間

al:平均鎖定時(shí)間

ar:平均返回記錄數(shù)

at:平均查詢(xún)時(shí)間

t:即為返回前面多少條的數(shù)據(jù)

g:后邊搭配一個(gè)正則匹配模式,大小寫(xiě)不敏感的

工作常用參考:

得到返回記錄集最多的10個(gè)SQL:mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log

得到訪問(wèn)次數(shù)最多的10個(gè)SQL:mysqldumpslow -s c -t 10 /var/lib/mysql/mysql-slow.log

得到按照時(shí)間排序的前10條里面含有左連接的SQL:mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql-slow.log

建議: 為方便 可以結(jié)合 | 和 more 使用,否則可能出現(xiàn)爆屏

mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容