如何定位並優化慢查詢sql

2021-10-22 17:03:41 字數 3141 閱讀 2939

慢查詢日誌的作用

-- 查詢慢查詢日誌是否開啟 以及 日誌存放的路徑

show variables like 'slow_query%'

查詢慢查詢sql的數量

-- 查詢慢查詢sql的數量

show status like '%slow_queries%'

開啟慢日誌命令

set global slow_query_log =on;
設定慢查詢sql時間,如果sql查詢超過1秒,則記錄,注意:設定完後,需要重新連線,才能看到是否生效

set global long_query_time=1;
以上set引數也可以在my.cnf(linux) 或 my.ini(windows)這個配置檔案裡進行設定,如果是直接命令方式,當重啟資料庫服務的時候,就有復原了

注意:開啟以上的設定,只是監聽記錄 本視窗的慢查詢

將explain關鍵字放在select語句前面,用於描述mysql是如何執行查詢操作的 並返回 查詢sql返回的行數,explain

可以幫助我們分析select語句讓我們知道查詢效率低下的原因,從而改進我們的查詢,讓查詢優化器能夠更好的工作

例如:

explain select * from act_hi_varinst order by name_ desc;
type

type表示的是mysql找到需要資料行的方法,方式,效能重最優到最差如下:

system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>

index>all

index和all表示走的是全表掃瞄,但看到type是這兩個值中的任何乙個,證明語句是需要有優化的

extra

可以從extar獲取到一些更為詳細的資訊,輔助我們了解sql語句執行的執行方式,extra**現以下2項意味著mysql根本不能

使用索引,效率會受到重大影響,應盡可能的對此進行優化。

extra項

說明using filesort

using temporary

表示mysql在對查詢結果排序時使用了臨時表。常見於排序order by和分組查詢group by

使用force index 是強制使用某一類索引,可以用來判斷走哪個索引是最優的,例如:

explains select count(id) froun tablename force index(primary)
技巧1 比較運算子能用 「=」就不用「<>」「=」增加了索引的使用機率。

技巧2 明知只有一條查詢結果,那請使用 「limit 1」

「limit 1」可以避免全表掃瞄,找到對應結果就不會再繼續掃瞄了。

技巧3 為列選擇合適的資料型別

能用tinyint就不用smallint,能用smallint就不用int,道理***,磁碟和記憶體消耗越小越好嘛。

技巧4 將大的delete,update or insert 查詢變成多個小查詢

能寫乙個幾十行、幾百行的sql語句是不是顯得逼格很高?然而,為了達到更好的效能以及更好的資料控制,你可以將他們變成多個小查詢。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-gkp8ugdf-1619935558069)(d:\idea-work\real\xygxbg\xygxbg-git\litaofeng\docs.vuepress\public\mysql\1613841473606.png)]

技巧5 使用union all 代替 union,如果結果集允許重複的話

因為 union all 不去重,效率高於 union。

技巧6 為獲得相同結果集的多次執行,請保持sql語句前後一致

這樣做的目的是為了充分利用查詢緩衝。

比如根據地域和產品id查詢產品**,第一次使用了:

select price from

order

where id=

123and regin=

'shanghai'

那麼第二次同樣的查詢,請保持以上語句的一致性,比如不要將where語句裡面的id和region位置調換順序。

技巧7 盡量避免使用 「select *」

如果不查詢表中所有的列,盡量避免使用 select *,因為它會進行全表掃瞄,不能有效利用索引,增大了資料庫伺服器的負擔,以及它與應用程式客戶端之間的網路io開銷。

技巧8 where 子句裡面的列盡量被索引

只是「盡量」哦,並不是說所有的列。因地制宜,根據實際情況進行調整,因為有時索引太多也會降低效能。

技巧9 join 子句裡面的列盡量被索引

同樣只是「盡量」哦,並不是說所有的列。

技巧10 order by 的列盡量被索引

order by的列如果被索引,效能也會更好。

技巧11 使用 limit 實現分頁邏輯

不僅提高了效能,同時減少了不必要的資料庫和應用間的網路傳輸。

技巧12 使用 explain 關鍵字去檢視執行計畫

explain 可以檢查索引使用情況以及掃瞄的行。

其他

sql調優方法有很多種,同樣的查詢結果可以有很多種不同的查詢方式。其實最好的方法就是在開發環境中用最貼近真實的資料集和硬體環境進行測試,然後再發布到生產環境中。

mysql慢查詢日誌

mysql聯合索引最左匹配原則

mysql鎖

mysql優化

回到主導航頁

如何定位並優化慢查詢Sql

主要關注下述三個變數 long query time show query log file show query log 慢查詢sql會被記錄到show query log file 日誌檔案中。show variables like quer 查詢相關變數 show status like sh...

MySQL如何定位並優化慢查詢sql

show variables like query 查詢慢日誌相關資訊 slow query log 預設是off關閉的,使用時,需要改為on 開啟 slow query log file 記錄的是慢日誌的記錄檔案 long query time 預設是10s,每次執行的sql達到這個時長,就會被記...

MySQL如何定位並優化慢查詢sql

show variables like query 查詢慢日誌相關資訊 slow query log 預設是off關閉的,使用時,需要改為on 開啟 slow query log file 記錄的是慢日誌的記錄檔案 long query time 預設是10s,每次執行的sql達到這個時長,就會被記...