mysql優化之 — 慢SQL分析


對慢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;

   

 

轉自:https://www.cnblogs.com/zjxiang/p/9157398.html

 


免責聲明!

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



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