Hi,大家好!我是白日夢。
今天我要跟你分享的話題是:“聊聊什么是慢查、如何監控?如何排查?”
一、 推薦閱讀方式
首發地址:https://mp.weixin.qq.com/s/tXTLMCiVpEnnmhUclYR19Q
使用推薦閱讀,有更好的閱讀體驗
二、什么是慢查?
慢查,顧名思義就是很慢的查詢。SQL的執行總是有一個執行時間的,通過long_query_time參數告訴MySQL,當SQL的執行時間超過該參數的指定值后就將這條SQL記錄在慢查日志中。
默認的long_query_time默認值為10s

三、怎么調整界定慢查的時間?
設置全局慢查時間為0.2秒。

注意:long_query_time屬於dynamic類型的參數。意思是像上面這樣在會話A中通過命令行的方式設置全局 long_query_time為0.2秒后,再打開一個新的會話B查看該變量會發現 long_query_time=0.2
但是在會話A中查看session級別的long_query_time依然為默認的10s
四、慢查日志像binlog那樣是真實的日志文件嗎?
在MySQL5.1之前確實慢查日志確實是以文件的形式存在。但是MySQL5.1之后MySQL允許我們可以將慢查日志放入一個數據表中,便於我們查看分析。

現在公司使用的一般都是5.6~5.7版本。當然即使5.1版本之后支持了將數據放入Table中,默認配置依然是File。
當然你也可以通過下面的命令將慢查輸出類型改成Table

五、慢查有什么危害?
研發同學都知道:對於Linux操作系統來說,一個進程能打開的Socket文件句柄是上限的。即使我們可以動態的調整它的大小,但是也做不到無限大。
通過命令: 查看進程被限制的使用各種資源的量
Copyulimit -a
core file size: 進程崩潰是轉儲文件大小限制
man loaded memort 最大鎖定內存大小
open file 能打開的文件句柄數
大量的慢查占據MySQL連接(Linux操作系統會為每一條連接創建socket文件),慢查累積到一定程度還會導致正常的SQL得不到連接執行從而變成慢查SQL,最終有可能導致MySQL的連接全部被耗光而夯死。這就是生產級別的事故了。
六、如何監控慢查?
查看曾經執行完成的慢查
如果你需要編寫一個監控程序探測MySQL的慢查詢。那完全可以探測分析MySQL的slow.log
如果你還不知道slow.log在哪里,可以像下面這樣定位到它。slow.log中記錄的就是曾經執行過的慢查信息。

這是你可以嘗試使用select sleep(2);模擬一條慢查SQL
然后去慢查sql中查看具體的慢查詳情。 
查看正在進行的慢查SQL
我在A Session中發起SQL,select sleep(60);
然后在B Session中通過下圖的方式可以看到當前正在進行的慢查情況。大家在看的時候注意:Command的類型為Query

MySQL也為用戶提供了一些原生的慢查工具。比如:查看執行時間最長的10條SQL
mysqldumpslow -s a1 -n 10 mysql.slow_log
了解即可
七、線上出慢查了如何處理?
首先你得知道通常情況下每個公司都有自己監控系統,或者是監控腳本,具體的監控邏輯就是上節講述的思路。故一旦出現報警,DBA同學會在第一時間接到消息。
DBA同學一般都會去聯系業務同學,由業務同學去處理這個慢查。(相信已經工作的同學深有這個體會)
(更多內容歡迎關注白日夢的公眾號閱讀)
關注我看更多內容,每早推送,可以在地鐵、班車上、上班前閱讀! ......
查看MySQL專題110篇文章大綱:https://mp.weixin.qq.com/s/HTw-Z-SyprYA8bCBZ4NpGQ
參考:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
推薦閱讀

- 大家常說的基數是什么?(已發布)
- 講講什么是慢查!如何監控?如何排查?(已發布)
- 對NotNull字段插入Null值有啥現象?(已發布)
- 能談談 date、datetime、time、timestamp、year的區別嗎?(已發布)
- 了解數據庫的查詢緩存和BufferPool嗎?談談看!(已發布)
- 你知道數據庫緩沖池中的LRU-List嗎?(已發布)
- 談談數據庫緩沖池中的Free-List?(已發布)
- 談談數據庫緩沖池中的Flush-List?(已發布)
- 了解臟頁刷回磁盤的時機嗎?(已發布)
- 用十一張圖講清楚,當你CRUD時BufferPool中發生了什么!以及BufferPool的優化!(已發布)
- 聽說過表空間沒?什么是表空間?什么是數據表?(已發布)
- 談談MySQL的:數據區、數據段、數據頁、數據頁究竟長什么樣?了解數據頁分裂嗎?談談看!(已發布)
- 談談MySQL的行記錄是什么?長啥樣?(已發布)
- 了解MySQL的行溢出機制嗎?(已發布)
- 說說fsync這個系統調用吧! (已發布)
- 簡述undo log、truncate、以及undo log如何幫你回滾事物! (已發布)
- 我勸!這位年輕人不講MVCC,耗子尾汁! (已發布)
- MySQL的崩潰恢復到底是怎么回事? (已發布)
- MySQL的binlog有啥用?誰寫的?在哪里?怎么配置 (已發布)
- MySQL的bin log的寫入機制 (已發布)
面試官都關注了!你還在猶豫什么呢?

