MySQL慢日志分析慢SQL


慢日志

  • MySQL的慢查詢日志是MySQL提供一種日志記錄,它用來記錄MySQL中響應時間超過閾值的語句具體指運行時間超過long_query_time值的SQL,則會被記錄到慢日志中

    具體指運行時間超過long_query_time值得SQL,則會被記錄到慢查詢日志中,long_query_time值默認為10,意思是運行10秒以上的語句。

  • 由他來查看哪些SQL超出了我們最大忍耐時間值,比如一條sql執行超過5秒鍾,我們就算慢SQL,希望能收集超過5秒sql,結合之前explain進行全面分析。

  • 默認情況下,MySQL沒有開啟慢日志,需要手動設置這個參數。當然如果不是調優需要,一般不建議啟動參數,因為開啟慢日志會或多或少帶來一定性能影響,慢查詢日志支持將日志記錄寫入文件。

  • 查看是否開啟慢日志:默認情況下slow_query_log關閉的

    show variables like "%slow_query_log%";
    

    • 開啟慢日志:

      1.終端開啟:
      	set global slow_query_log=1;
      	
      但是這樣開啟,只是只對當前數據庫生效,重啟數據庫MySQL 則會失效
      
      2.永久啟動慢日志:
      	修改配置文件:my.cnf
          [mysqld]下增加或修改參數:
          slow_query_log=1
          slow_query_log_file=/var/lib/mysql/{host_name}-slow.log
      
  • 查看慢日志記錄的閾值:默認long_query_time =10秒

    show variables like 'long_query_time%';
    

    • 修改閥值:

      1.終端修改:
      	# 更改閥值為3秒
      	set global long_query_time=3;
      需要注意的是,設置完慢sql的閥值,需要關閉窗口,重新進入窗口,輸入下面命令查看是否成功設置:
      	show global variables like "long_query_time";
      2.永久配置慢日志閾值:
      	slow_query_log=1;
          slow_query_log_file=路徑
          long_query_time=3;
          log_output=FILE	
      
  • 慢日志文件記錄:

    • 先模擬一條查詢的慢SQL語句:

      select sleep(4);
      
    • 進入慢日志查看:

      Query_time 執行時間
      use 當前庫
      SET timestamp 當前時間戳
      導致問題sql語句
      
    • 查看慢日志條數:

      show global status like 'Slow_queries%';
      

mysqldumpslow 日志分析工具

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

  • 這里在lInux系統操作:我們先看看mysqldumpslow給我們提供了什么方法

    [root@VM_0_2_centos ~]# mysqldumpslow --help
    Parse and summarize the MySQL slow query log. Options are
    
      --verbose    verbose
      --debug      debug
      --help       write this text to standard output
    
      -v           verbose
      -d           debug
      -s ORDER     what to sort by (al, at, ar, ae, c, l, r, e, t), 'at' is default
                    al: average lock time
                    ar: average rows sent
                    at: average query time
                     c: count
                     l: lock time
                     r: rows sent
                     t: query time  
      -r           reverse the sort order (largest last instead of first)
      -t NUM       just show the top n queries
      -a           don't abstract all numbers to N and strings to 'S'
      -n NUM       abstract numbers with at least n digits within names
      -g PATTERN   grep: only consider stmts that include this string
      -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
                   default is '*', i.e. match all
      -i NAME      name of server instance (if using mysql.server startup script)
      -l           don't subtract lock time from total time
    
  • 常用方法:

    s:表示按照何種方式排序
    c: 訪問次數
    l: 鎖定時間
    r: 返回記錄
    t: 查詢時間
    al: 平均鎖定時間
    ar: 平均返回記錄數
    at: 平均查詢時間
    t: 即為返回前面多少條數據
    g: 后邊搭配一個正則匹配模式,大小寫不敏感的
    
  • 案例:

    # 得到返回記錄集最多的10個SQL
    mysqldumpslow -s r -t 10 /var/lib/mysql/VM_0_2_centos-slow.log
    # 得到訪問次數最多的10個SQL
    mysqldumpslow -s c -t 10 /var/lib/mysql/VM_0_2_centos-slow.log
    # 得到按照時間排序的前10條里面含有左連接的查詢語句
    mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/VM_0_2_centos-slow.log
    # 另外建議在使用這些命令時結合 | 和 more  使用,否則有可能出現爆屏現象
    mysqldumpslow -s r -t 10 /var/lib/mysql/VM_0_2_centos-slow.log | more
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM