對慢sql優化一般可以按下面幾步的思路:
1、開啟慢查詢日誌,設定超過幾秒為慢sql,抓取慢sql
2、通過explain對慢sql分析(重點)
3、show profile查詢sql在mysql伺服器裡的執行細節和生命週期情況(重點)
4、對資料庫伺服器的引數調優
1、設定慢查詢
(1)設定開啟:set global slow_query_log = 1; #預設未開啟,開啟會影響效能,mysql重啟會失效2、獲取慢sql資訊(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
檢視慢查詢日誌記錄數: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通過explain分析慢sql很重要,單獨一章列舉,mysql優化(4):explain分析。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:後邊搭配乙個正則匹配模式,大小寫不敏感
show profile也是分析慢sql的一種手段,但它能獲得比explain更詳細的資訊,能分析當前會話中語句執行的資源消耗情況,能獲得這條sql在整個生命週期的耗時,相當於執行時間的清單,也很重要。
1、預設關閉。開啟後,會在後台儲存最近15次的執行結果,然後通過show profile命令檢視結果。
開啟:set profiling = on;2、通過show profile能檢視sql的耗時檢視:show variables like 'profiling%';
3、通過query_id可以得到具體sql從連線 - 服務 - 引擎 - 儲存四層結構完整生命週期的耗時
可用引數type:4、出現這四個status時說明有問題,group by可能會建立臨時表all #顯示所有的開銷資訊
block io #顯示塊io相關開銷
context switches #上下文切換相關開銷
cpu #顯示cpu相關開銷資訊
ipc #顯示傳送和接收相關開銷資訊
memory #顯示記憶體相關開銷資訊
page faults #顯示頁面錯誤相關開銷資訊
source #顯示和source_function,source_file,source_line相關的開銷資訊
swaps #顯示交換次數相關開銷的資訊
#危險狀態:converting heap to myisam #查詢結果太大,記憶體不夠用了,在往磁碟上搬
creating tmp table #建立了臨時表,回先把資料拷貝到臨時表,用完後再刪除臨時表
copying to tmp table on disk #把記憶體中臨時表複製到磁碟,危險!!!
只在測試環境用,別在生產環境用,會記錄所有使用過的sql
1、開啟:
開啟:會將sql記錄到mysql庫的general_log表2、檢視set global general_log=1;
set global log_output='table';
配置檔案的方式:
在my.cnf中配置
general_log=1 #開啟
general_log_file=/path/logfile #記錄日誌檔案的路徑
log_output=file #輸出格式
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預期一致 從鎖定記錄較少的表...