序言: 在我面試不少人的過程當中,不少人談到SQL優化都頭頭是道,建索引,explain分析,like全模糊會致使索引失效 云云,因而我問道:優化以前,須要找出數據庫中好比超過2s的慢SQL,你是怎麼找的?不少人答不上來,要是找都找不到,怎麼去優化呢,一箇中大型系統可能成千上萬條SQL都不過度,難道要一個個去分析麼。linux
因此今天和你們聊聊 慢SQL的挖掘機-慢查詢日誌面試
MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time
值的SQL,則會被記錄到慢查詢日誌中。sql
固然,若是不是調優須要的話,通常不建議啓動該參數,由於開啓慢查詢日誌會或多或少帶來必定的性能影響。數據庫
開啓了慢查詢日誌後,什麼樣的SQL纔會記錄到查詢日誌裏面?工具
這個是由參數long_query_time控制,默認狀況下long_query_time的值爲10秒性能
查看命令: show variables like 'long_query_time%';優化
注: 永久設置慢查詢日誌開啓,以及設置慢查詢日誌時間臨界點(不建議)ui
linux中,mysql配置文件通常默認在 /etc/my.cnf 更改對應參數便可日誌
爲何設置後看不出變化:
查看慢查詢日誌:
cat -n /data/mysql/mysql-slow.log
從慢查詢日誌中,咱們能夠看到每一條查詢時間高於3s 的sql語句,並能夠看到執行的時間是多少。
好比上面,就表示 sql語句 select * from comic where comic_id < 1952000; 執行時間爲3.902864秒,超出了咱們設置的慢查詢時間臨界點3s,因此被記錄下來了
查看有多少條慢查詢記錄: show global status like '%Slow_queries%';
在生產環境中,若是要手工分析日誌,查找、分析SQL,顯然是個體力活,MySQL提供了日誌分析工具 mysqldumpslow
工做經常使用參考:
獲得返回記錄集最多的10個SQL: mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log
獲得訪問次數最多的10個SQL: mysqldumpslow -s c -t 10 /var/lib/mysql/mysql-slow.log
獲得按照時間排序的前10條裏面含有左鏈接的SQL: mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql-slow.log
建議: 爲方便 能夠結合 | 和 more 使用,不然可能出現爆屏
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more