問題提出:你作業的時候,老板可能會問你,我的資料庫系統跑了一年了,系統查詢資料變慢了,怎么進行優化?那你肯定說建立索引優化就搞定了, 那是不是所有的SQL都有問題呢?當然不是,我要對特定的SQL陳述句進行有針對的優化,找出查詢最慢的,找出查詢次數最多的,我統計出來,然后進行有針對性的進行優化,那怎么辦呢?我們就需要用到慢查詢日志這個工具了,下面詳細說一下慢查詢到底怎么用,
在公司中一般普通的開發程式員是接觸不到這些的,因為沒有權限去操作資料庫,一般交給運維人員來做,一般是讓運維人員打開慢查詢日志,截取一天的資料,或者是一段時間的查詢資料,具體找出查詢最慢的,找出查詢次數最多的SQL陳述句進行優勢,
慢查詢是什么
- MySQL的慢查詢日志是MySQL提供的一種日志記錄,它用來記錄在MySQL中回應時間超過閥值的陳述句,具體指運行時間超過
long_query_time值的SQL,則會被記錄到慢查詢日志中, - 具體指運行時間超過
long_query_time值的SQL,則會被記錄到慢查詢日志中,long_query_time的默認值為10,意思是運行10秒以上的陳述句, - 由他來查看哪些SQL超出了我們的最大忍耐時間值,比如一條sql執行超過5秒鐘,我們就算慢SQL,希望能收集超過5秒的sql,結合
explain進行全面分析,
(注意:慢查詢日志不是一直開著的,開啟慢查詢日志后,但凡發生sql慢了,都要寫到日志里面,寫日志會發生IO,進而使系統會變的更慢,)
慢查詢日志怎么用
默認情況下,MySQL資料庫沒有開啟慢查詢日志,需要我們手動來設定這個引數,
當然,如果不是調優需要的話,一般不建議啟動該引數,因為開啟慢查詢日志會或多或少帶來一定的性能影響,慢查詢日志支持將日志記錄寫入檔案
查看是否開啟慢查詢日志
查看慢查詢是否開啟
SHOW VARIABLES LIKE '%slow_query_log%';
在這里插入圖片描述
默認情況下slow_query_log的值為OFF,表示慢查詢日志是禁用的,
可以通過設定slow_query_log的值來開啟
使用
set global slow_query_log=1;
開啟了慢查詢日志只對當前資料庫生效,

如果MySQL重啟后則會失效,
什么樣的sql會被記錄到慢查詢日志中
SHOW VARIABLES LIKE '%slow_query_log%';

這個是由引數long_query_time控制,默認情況下long_query_time的值為10秒,意思就是超過十秒的查詢才會被記錄到慢查詢日志中,這個時間太長了,我們需要修改默認值,
可以使用命令修改,也可以在my.cnf引數里面修改,
假如運行時間正好等于long_query_time的情況,并不會被記錄下來,也就是說,
在mysql原始碼里是判斷大于long_query_time,而非大于等于,
設定閾值為0.1s
set long_query_time=0.1

沒有加global只是在當前視窗有效,一旦重新連接資料庫就失效了
set global long_query_time=0.1
加global,MySQL重啟后則會失效,
SHOW VARIABLES LIKE '%slow_query_log%';

運行幾條sql陳述句,打開/var/lib/mysql/cocoon-slow.log查看慢查詢日志


查詢當前系統中有多少條慢查詢記錄,
show global status like '%Slow_queries%';

日志分析工具mysqldumpslow
在生產環境中,如果要手工分析日志,查找、分析SQL,顯然是個體力活,MySQL提供了日志分析工具mysqldumpslow,
mysqldumpslow --help


#得到回傳記錄集最多的10個SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
#得到訪問次數最多的10個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
#得到按照時間排序的前10條里面含有左連接的查詢陳述句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
#另外建議在使用這些命令時結合 | 和more 使用 ,否則有可能出現爆屏情況
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/216282.html
標籤:其他
上一篇:【資料結構——圖的遍歷】
