mysql優化之 慢SQL分析

2022-04-21 22:30:09 字數 3149 閱讀 7723

對慢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很重要,單獨一章列舉,mysql優化(4):explain分析。

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  #把記憶體中臨時表複製到磁碟,危險!!!

只在測試環境用,別在生產環境用,會記錄所有使用過的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;
**:

sql優化之慢sql優化實踐 點滴

sp order day current 表存在480w條資料 關聯sp service site表id的外來鍵sj site sp service site 表存在3w條資料 1 2 3 4 5 6 7 8 9 in的寫法 22秒 select from sp order day current ...

MySQL優化篇之慢查詢

1.什麼是mysql的慢查詢?mysql中最影響速度的就是那些 查詢非常慢的語句,這些慢的語句,可能是寫的不夠合理或者是大資料下多表的聯合 查詢等等,所以我們要找出這些語句,分析原因,加以優化。2.檢視和配置mysql慢查詢相關資訊 第一,慢查詢,這個慢,時間上是怎麼定義的?多久才算慢呢?mysql...

MySQL學習之慢查詢優化

0.先執行看看是否真的很慢,注意設定sql no cache 1.where條件單錶查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單錶每個字段分別查詢,看哪個欄位的區分度最高 2.explain檢視執行計畫,是否與1預期一致 從鎖定記錄較少的表...