1. 程式人生 > >MySQL優化(3):慢SQL分析

MySQL優化(3):慢SQL分析

正則 測試 ron 得到 引擎 sql tin 對數 xpl

對慢SQL優化一般可以按下面幾步的思路:

1、開啟慢查詢日誌,設置超過幾秒為慢SQL,抓取慢SQL

2、通過explain對慢SQL分析(重點)

3、show profile查詢SQL在Mysql服務器裏的執行細節和生命周期情況(重點)

4、對數據庫服務器的參數調優

一、慢查詢日誌

1、設置慢查詢

(1)設置開啟:SET GLOBAL slow_query_log = 1;   #默認未開啟,開啟會影響性能,mysql重啟會失效
(2)查看是否開啟:SHOW VARIABLES LIKE %slow_query_log%;
(3)設置閾值:SET GLOBAL long_query_time=
3; (4)查看閾值:SHOW 【GLOBAL】 VARIABLES LIKE long_query_time%;  #重連或新開一個會話才能看到修改值 (5)通過修改配置文件my.cnf永久生效,在[mysqld]下配置:   [mysqld]   slow_query_log = 1;  #開啟   slow_query_log_file=/var/lib/mysql/atguigu-slow.log   #慢日誌地址,缺省文件名host_name-slow.log   long_query_time=3;   #運行時間超過該值的SQL會被記錄,默認值>10   log_output=
FILE           

2、獲取慢SQL信息   

查看慢查詢日誌記錄數:SHOW GLOBAL STATUS LIKE %Slow_queries%;

  模擬語句:select sleep(4);

  查看日誌:cat atguigu-slow.log

  技術分享圖片

3、搭配日誌分析工具mysqldumpslow

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個SQL
mysqldumpslow 
-s t -t 10 -g "LEFT JOIN" /var/lib/mysql/atguigu-slow.log #得到按照時間排序的前10條裏面含有左連接的查詢語句 mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more #結合| more使用,防止爆屏情況 s:表示按何種方式排序 c:訪問次數 l:鎖定時間 r:返回記錄 t:查詢時間 al:平均鎖定時間 ar:平均返回記錄數 at:平均查詢時間 t:返回前面多少條的數據 g:後邊搭配一個正則匹配模式,大小寫不敏感

二、explain分析慢SQL

  通過explain分析慢SQL很重要,單獨一章列舉,MySQL優化(4):explain分析。

三、Show Profile分析慢SQL

  Show Profile也是分析慢SQL的一種手段,但它能獲得比explain更詳細的信息,能分析當前會話中語句執行的資源消耗情況,能獲得這條SQL在整個生命周期的耗時,相當於執行時間的清單,也很重要。

1、默認關閉。開啟後,會在後臺保存最近15次的運行結果,然後通過Show Profile命令查看結果。

開啟:set profiling = on;
查看:SHOW VARIABLES LIKE profiling%;

2、通過Show Profile能查看SQL的耗時

   技術分享圖片

3、通過Query_ID可以得到具體SQL從連接 - 服務 - 引擎 - 存儲四層結構完整生命周期的耗時

  技術分享圖片

可用參數type:
ALL    #顯示所有的開銷信息
BLOCK IO  #顯示塊IO相關開銷
CONTEXT SWITCHES  #上下文切換相關開銷
CPU     #顯示CPU相關開銷信息
IPC     #顯示發送和接收相關開銷信息
MEMORY #顯示內存相關開銷信息
PAGE FAULTS  #顯示頁面錯誤相關開銷信息
SOURCE  #顯示和Source_function,Source_file,Source_line相關的開銷信息
SWAPS  #顯示交換次數相關開銷的信息

4、出現這四個status時說明有問題,group by可能會創建臨時表

#危險狀態:
converting HEAP to MyISAM   #查詢結果太大,內存不夠用了,在往磁盤上搬 Creating tmp table   #創建了臨時表,回先把數據拷貝到臨時表,用完後再刪除臨時表 Copying to tmp table on disk  #把內存中臨時表復制到磁盤,危險!!! locked

  技術分享圖片

四、全局查詢日誌

只在測試環境用,別在生產環境用,會記錄所有使用過的SQL

1、開啟:

開啟:會將sql記錄到mysql庫的general_log表
    set global general_log=1;
    set global log_output=TABLE;
配置文件的方式:
    在my.cnf中配置
    general_log=1    #開啟
    general_log_file=/path/logfile    #記錄日誌文件的路徑
    log_output=FILE    #輸出格式

2、查看

select * from mysql.general_log;

  技術分享圖片

MySQL優化(3):慢SQL分析