序言: 很多人談到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