如何查詢MySQL中查詢慢的SQL語句並優化

2021-10-11 19:06:06 字數 3686 閱讀 6270

在mysql中,支援慢日誌記錄功能,通過指定統計執行時間閾值與日誌存放位置來實現

mysql預設統計時間為10s,而且預設統計是關閉的,那麼如何開啟統計呢?

這裡分為兩種情況

第一種情況是在mysql ini配置檔案中新增鍵和值,通常適用於從資料庫啟動即開啟統計日誌

第二種情況是在不適合關閉伺服器而臨時需要統計時(在mysql下次關閉前都有效),可以通過命令直接設定,然後重新建立乙個連線即可

具體設定如下:

首先檢視是否開啟了統計

如果slow_query_log的值為off則表示沒有開啟。

第一種:找到my.ini檔案,配置如下,並重啟mysql服務

[mysqld]

slow_query_log = on; #開啟慢查詢

long_query_time = 1 #設定統計時間閾值,sql執行超過這個時間即統計,單位是秒

slow_query_log_file = /tmp/slow.log #日誌存放位置

第二種:開啟mysql客戶端,執行下面的語句

set global slow_query_log = on;#開啟慢日誌統計

set global long_query_time = 2.000000;#設定統計時間閾值,sql執行超過這個時間即統計,單位是秒

設定後重新啟動客戶端連線後再次檢視slow_query_log屬性值,如果為on則設定成功

設定完成之後需要重新連線資料庫才能生效

通過日誌我們可以獲取到慢sql資訊,就可以針對性的優化,mysql提供了explain關鍵字幫助我們分析sql語句的執行方式

explain + sql查詢語句  #語法,一般來說我們分析的都是查詢的效能,所以是查詢語句
示例:

explain select * from convertedfile where id = 1
這是一條簡單的sql,通過主鍵查詢唯一的記錄,執行結果如下

可以看到結果中包含10列資訊,分別為

id、select_type、table、type、possible_keys、key、key_len、ref、rows、extra

對應的簡單描述如下:

id: select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序===id如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優先順序越高,越先執行

select_type: 表示查詢的型別。用於區別普通查詢、聯合查詢、子查詢等的複雜查詢。

table: 輸出結果集的表 顯示這一步所訪問資料庫中表名稱(顯示這一行的資料是關於哪張表的),有時不是真實的表名字,可能是簡稱,例如上面的e,d,也可能是第幾步執行的結果的簡稱

partitions:匹配的分割槽

type:對錶訪問方式,表示mysql在表中找到所需行的方式,又稱「訪問型別」。

possible_keys:表示查詢時,可能使用的索引

key:表示實際使用的索引

key_len:索引欄位的長度

ref:列與索引的比較

rows:掃瞄出的行數(估算的行數)

filtered:按表條件過濾的行百分比

extra:執**況的描述和說明

挑選一些重要資訊詳細說明:

***一般來說,得保證查詢至少達到range級別,最好能達到ref。

system表只有一行記錄(等於系統表),這是const型別的特列,平時不會出現,這個也可以忽略不計

const通過索引一次就找到了,const用於比較primary key 和 unique key,因為只匹配一行資料,所以很快。如果將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量

eq_ref唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵索引和唯一索引 區別於const eq_ref用於聯表查詢的情況

ref非唯一索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,他可能會找到多個符合條件的行,所以他應該屬於查詢和掃瞄的混合體

range只檢索給定範圍的行,使用乙個索引來選擇行,一般是在where**現between、、in等查詢,範圍掃瞄好於全表掃瞄,因為他只需要開始於索引的某一點,而結束於另一點,不用掃瞄全部索引

indexfull index scan,index與all區別為index型別只遍歷索引樹。通常比all快,因為索引檔案通常比資料檔案小。也就是說,雖然all和index都是讀全表,但是index是從索引中讀取的,而all是從硬碟讀取的

allfull table scan,將遍歷全表以找到匹配的行

索引的分類:聚簇索引,非聚簇索引,唯一索引,聯合索引,覆蓋索引

聚簇索引(又可以成為聚集索引):在innodb引擎中主鍵使用聚集索引,聚集索引的主要特點是b+樹的葉子節點不僅包含主鍵也包含資料列的所有資訊。這樣做的好處是找到主鍵索引的同時即可找到資料資訊

非聚簇索引:區別於聚簇索引,非聚簇索引的葉子節點中只包含主鍵資訊和資料指標(引用位址),相較於聚集索引還需要一次io用來檢索資料列資訊。在myisam引擎中,無論主鍵索引還是其他索引,都是使用非聚集索引

唯一索引:建立唯一索引的資料列中值是唯一的,表中可以有多個唯一索引。主鍵本身也是唯一索引,不過兩者是有本質區別的,最大的區別是乙個表中只包含乙個主鍵

聯合索引:多個字段共同組成索引

覆蓋索引:所要查詢的資料列恰好都在索引中,僅需通過索引即可完成查詢,效率較高

為了使索引的使用效率更高,在建立索引時,必須考慮在哪些欄位上建立索引和建立什麼型別的索引,有7大原則:

1.選擇唯一性索引

2.為經常需要排序、分組和聯合操作的字段建立索引

3.為常作為查詢條件的字段建立索引

4.限制索引的數目

5.盡量使用資料量少的索引

6.盡量使用字首來索引

7.刪除不再使用或者很少使用的索引

8. 經常更新修改的字段不要建立索引(針對mysql說,因為字段更改同時索引就要重新建立,排序,而orcale好像是有這樣的機制字段值更改了,它不立刻建立索引,排序索引,而是根據更改個數,時間段去做平衡索引這件事的)

9、不推薦在同一列建多個索引

mysql 慢查詢 MySQL慢查詢

一 簡介 開啟慢查詢日誌,可以讓mysql記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。二 引數說明 slow query log 慢查詢開啟狀態 slow query log file 慢查詢日誌存放的位置 這個目錄需要mysql的執行帳號的可寫許可權,一般...

mysql如何開啟慢查詢

1,情景描述 做sql優化時,我們需要對慢的sql查詢進行優化,這時就需要開啟sql慢查詢。它能記錄下所有執行超過long query time時間的sql語句,幫你找到執行慢的sql,方便我們對這些sql進行優化.2,檢視是否開啟慢查詢?首先我們先檢視mysql伺服器的慢查詢狀態是否開啟.執行如下...

mysql慢查詢日誌 如何開啟MySQL慢查詢日誌

摘要 前言 資料庫日誌記錄了使用者對資料庫的各種操作及資料庫發生的各種事件。能幫助資料庫管理員追蹤 分析問題。mysql提供了錯誤日誌 二進位制日誌 查詢日誌 慢查詢日誌。mysql的慢查詢日誌是mysql提供的一種日誌記錄,它用來記錄在mysql中響應時間超過閥值 long query time,...