MySQL慢查詢及優化

2021-10-23 15:16:38 字數 2457 閱讀 8900

最近做乙個crm系統,發現了慢查詢日誌裡記載了許多的慢sql,於是就對其進行了sql優化。在優化的過程中,自己也歸納整理了一些sql優化的方案。今天就來和大家聊聊。

1、慢查詢的分析

常見的分析慢查詢sql的方法大概有三種:explain、show profile、trace 分析 sql優化器。本文主要介紹explain的方法去分析慢sql,其餘兩種方法有興趣的同學可以去了解下。

2、explain各引數解釋

(1)explain語法:explain+「需分析的sql」;

例:我想分析「select * from table1 where b=500;」這條sql的執行效率,那麼直接在sql命令列下執行「expalin select * from table1 where b=500;」就可以檢視了;執行結果如下:

根據上圖,可以看到有許多個字段,那這些字段分別有什麼意義呢?見下圖(紅框標出的為重點關注字段):

其中各個欄位又可能有多個不同的值,重點關注欄位select_type、type、extra的可能值如下圖所示:

其中,上圖中的「type」的值的查詢效能從上到下依次是最好到最差。

3、常用sql優化方法(2)分頁優化

如:select * from table1 order by a limit 99000,10; (其中,a欄位有索引)

但結果不走索引,原因是掃瞄整個索引並查詢到沒索引的行的成本比掃瞄全表的成本更高,所以優化器放棄使用索引。(關鍵是讓排序時返回的字段盡可能少)

應改為:select * from table1 f inner join (select id from table1 order by a limit 99000,10)g on f.id = g.id;

或者 select * from table1 where id >= (select id from table1 order by a limit 99000,1) limit 10;

(3)連線查詢優化

在專案中,表連線查詢是比較常見的,尤其是一些統計模組。表連線有兩種演算法,一種叫nested-loop join 演算法(簡稱nlj),另一種是block nested-loop join 演算法(簡稱bnl)(關聯欄位不存在索引時會使用到)。感興趣的小夥伴可以深入去了解下相關原理哦。我們進行關聯查詢優化的方法是:盡量讓 bnl變成 nlj ,就是說在關聯欄位上加上索引。

(4)order by和group by優化

①首先我們要知道mysql中有兩種排序方式,一種是通過有序索引直接返回有序資料(extra欄位:using index);另一種是通過 filesort 進行的排序,不走索引(extra欄位:using filesort);毫無疑問,肯定是有序索引排序更快。

常見order by優化方法:

①在排序欄位上新增索引

如:select c,id from table1 order by c; (c有索引)

②多個字段排序,可以在多個排序欄位上新增聯合索引來優化排序語句

如:select id,a,b from table1 order by a,b; (a,b是聯合索引)

注意:select id,a,b from table1 order by b,a; (a,b是聯合索引)此時不走索引,最左匹配字首原則了解下

③對於先等值查詢再排序的語句,可以通過在條件欄位和排序字段新增聯合索引來優化

如:select id,a,b from table1 where a=1000 order by b; (a,b是聯合索引)

如果a,b不是聯合索引的話,即時有a索引,b索引,排序也不會走索引

④去掉不必要的返回字段

如:select * from table1 order by a,b; /* 根據a和b欄位排序查出所有欄位的值 /

應改為:select id,a,b from table1 order by a,b; / 根據a和b欄位排序查出id,a,b欄位的值 */

不走索引原因:掃瞄整個索引並查詢到沒索引的行的成本比掃瞄全表的成本更高,

所以優化器放棄使用索引。

預設情況,會對 group by 字段排序,因此group by優化方式與 order by 基本一致。

Mysql優化 慢查詢

先查詢是否開啟 開啟慢查詢日誌 set global slow query log 1 檢視引數設定 show variables like long query time 這裡查詢的是查過多少時間才會記錄成慢查詢 預設10 秒以上的s ql語句記錄到日誌中 修改引數 set global long...

Mysql慢查詢優化

二 優化這些慢查詢 3.細節優化 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作 修改配置檔案 在 my.ini 增加幾行 slow query log on log slow queries 儲存路徑 l...

Mysql 慢查詢優化

mysql 慢查詢的相關引數 使用show variables來查詢,set global來設定 slow query log 是否開啟慢查詢日誌,1表示開啟,0表示關閉。slow query log file mysql資料庫慢查詢日誌儲存路徑。可以不設定該引數,系統則會預設給乙個預設的檔案hos...