MySQL如何定位並優化慢查詢sql
1.如何定位並優化慢查詢sql
a.根據慢日誌定位慢查詢sql
SHOW VARIABLES LIKE'%query%' 查詢慢日誌相關資訊
slow_query_log 預設是off關閉的,使用時,需要改為on 開啟
slow_query_log_file 記錄的是慢日誌的記錄檔案
long_query_time 預設是10S,每次執行的sql達到這個時長,就會被記錄
SHOW STATUS LIKE'%slow_queries%'檢視慢查詢狀態
Slow_queries 記錄的是慢查詢數量 當有一條sql執行一次比較慢時,這個vlue就是1 (記錄的是本次會話的慢sql條數)
注意:
如何開啟慢查詢 : SET GLOBAL slow_query_log = ON;
將預設時間改為1S: SET GLOBAL long_query_time = 1;
(設定完需要重新連線資料庫,PS:僅在這裡改的話,當再次重啟資料庫服務時,所有設定又會自動恢復成預設值,永久改變需去my.ini中改)
b.使用explain等工具分析sql
在要執行的sql前加上explain 例如:EXPLAIN SELECT menu_name FROM t_sys_menu ORDER BY menu_id DESC;
接著看explain的關鍵欄位
type:
如果發現type的值是最後兩個中的其中一個時,證明語句需要優化了。
extra:
c.修改sql或者儘量讓sql走索引
mysql查詢優化器會根據具體情況自己判斷走哪個索引,不一定是走主鍵(explain中的key可以看到走的哪個key)具體情況根據具體情況來定,當你要強制執行走某一個key時:
在查詢的最後加上 force index(primary); 強制走主鍵的
2.聯合索引的最左匹配原則的成因
最左匹配原則的概念參考:https://www.cnblogs.com/lanqi/p/10282279.html
成因:
當通過(col3,col2)這樣的聯合索引去查詢時,可以看到也是一個B+樹的結構向下查詢,若直接通過col2去查詢,無法直接查詢到34、77。也就用不到這個聯合索引了。
3.索引是建立得越多越好嗎
1.資料量小的表不需要建立索引,建立會增加額外的索引開銷。
2.資料變更需要維護索引,因此更多的索引意味著更多的維護成本。
3.更多的索引意味著也需要更多的空間。