目前在生產(chǎn)環(huán)境的MySQL的主流版本有5.5, 5.6, 5.7三個(gè)版本愉耙,其中阿里云贮尉,騰訊云等主要使用的是5.6的版本(雙機(jī)高可用),?5.7的版本還在測試跟進(jìn)中朴沿,還未在云上大規(guī)模的使用猜谚。
這些主流的版本都已經(jīng)原生支持「慢日志」功能,只需要開啟并使用慢日志分析工具赌渣,即可找出慢查詢語句魏铅。相應(yīng)的云平臺也提供了慢日志的管理界面,不過也是在原生Mysql的慢日志功能的包裝和增強(qiáng)坚芜。
在這之前览芳,我們先看看關(guān)于慢查詢幾個(gè)重要的參數(shù):
開啟慢日志功能
有2種方式,一是修改mysql的配置文件鸿竖,二是通過set global語句來實(shí)現(xiàn)沧竟。
1、修改配置文件缚忧,Windows?的配置文件為?my.ini悟泵,一般在?MySQL?的安裝目錄下。linux?的配置文件為my.cnf?闪水,一般在?/etc?目錄下糕非。
在linux下,vim /etc/my.cnf球榆,在[mysqld]內(nèi)容項(xiàng)下增加
slow_query_log = ON
long_query_time = 2
我這里設(shè)置慢查詢時(shí)間long_query_time 設(shè)置的是2s朽肥,認(rèn)為超過2秒即為慢查詢
沒有配置日志文件路徑和名稱,就使用默認(rèn)的持钉。
重啟msyqld服務(wù)就可以生效衡招,登入msyql,查看生效情況
SHOW VARIABLES WHERE Variable_name IN('slow_query_log','long_query_time','slow_query_log_file','log-query-not-using-indexes');
可以看到重啟后右钾,日志生效蚁吝。
2旱爆、二是通過set global語句來實(shí)現(xiàn)舀射,可以在mysql -uroot -p登錄后,輸入:
SET GLOBAL slow_query_log = 'ON';
就可以立即開始慢日志記錄怀伦,如果想指定時(shí)間和文件位置脆烟,可以追加配置:
SET GLOBAL long_query_time = X;
X默認(rèn)是10s,也就是說超過10s的查詢會被記入慢日志房待。
SET GLOBAL slow_query_log_file = '/path/filename';
日志路徑默認(rèn)是:/var/lib/mysql/hostname-slow.log?文件名中默認(rèn)包含了當(dāng)前服務(wù)器的hostname邢羔,我們可以自定義路徑和文件名
可以立即生效驼抹,但是msyqld重啟以后會失效,因?yàn)閙syql重啟的時(shí)候拜鹤,是按照配置文件來加載配置的框冀,set global語句,只對當(dāng)前所有會話生效敏簿,并未修改配置文件明也。
慢日志除了記錄到文件,還可以記錄到數(shù)據(jù)庫表中惯裕。只要將mysql全局變量log_output設(shè)置為?TABLE即可温数。MySQL會將日志分別記錄到表mysql.gengera_log和mysql.slow_log二張表中。但是蜻势,我們推薦將日志記錄 在日記文件中撑刺,記錄到文件可以支持微秒,記錄到到數(shù)據(jù)庫表中并不支持握玛。
驗(yàn)證:
在測試的時(shí)候够傍,即便有幾十萬的記錄,一條語句很可能零點(diǎn)幾秒就執(zhí)行完了败许。好在Mysql提供了一個(gè)SLEEP函數(shù)王带,可以延遲返回查詢結(jié)果,比如:
現(xiàn)在去查看日志
可以看到剛才的慢查詢記錄市殷。
當(dāng)然隨著時(shí)間積累愕撰,慢日志文件會原來越大,使用cat醋寝,grep等命令分析會很困難搞挣。Mysql自帶mysqldumpslow的可以用做分析,當(dāng)然還有一個(gè)第三方開源的工具音羞,比如mk-query-digest囱桨,mysqlsla,myprofi
下面是網(wǎng)上總結(jié)的幾個(gè)工具
mysqldumpslow支持不支持perlmysql官方自帶
mysqlsla支持支持perl功能強(qiáng)大,數(shù)據(jù)報(bào)表齊全,定制化能力強(qiáng).
mysql-explain-slow-log支持不支持perl無
mysql-log-filter支持部分支持python or php不失功能的前提下,保持輸出簡潔
myprofi支持不支持php非常精簡
可能值得我們注意的地方有:
1嗅绰、初始化鎖的時(shí)間不算在執(zhí)行時(shí)間內(nèi)舍肠。Mysqld服務(wù)寫慢日志,是在sql語句執(zhí)行完窘面,并且所有的鎖釋放之后才進(jìn)行的翠语,所以日志順序和執(zhí)行順序有所不同。
2财边、如果是主從架構(gòu)(Master肌括,Slave),默認(rèn)從庫不會記錄相同的慢日志酣难。如果要修改谍夭,可以用log_slow_slave_statements來設(shè)置
找出慢日志黑滴,可以有效的幫我們我們優(yōu)化MySQL語句,當(dāng)然不是簡單的加個(gè)索引的事情紧索,可能涉及一些不合理的設(shè)計(jì)袁辈,比如該應(yīng)用層的操作,讓sql來做了珠漂;該做中間統(tǒng)計(jì)表的沒有做吵瞻,每次都是大表實(shí)時(shí)匯總;該用redis緩存的沒有用上甘磨;數(shù)據(jù)庫字段類型設(shè)計(jì)不合理橡羞,等等,需要細(xì)處著手济舆,全盤考慮卿泽。
具體參數(shù)可參考MySQL官方鏈接:
https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html