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