MYSQL檢視執行計畫

2021-09-22 03:55:48 字數 3089 閱讀 7954

1、概述:

執行計畫的檢視是進行資料庫的sql語句調優時依據的乙個重要依據,mysql的執行計畫檢視相對oracle簡便很多,功能也相對簡單很多的sql語句都不能直接檢視。

2、執行計畫的生成和檢視

2.1 執行計畫的生成方法:explain select …………….

生成的方法很簡單在相應的select前面加explain即可

2.2 執行計畫的檢視

id包含一組數字,表示查詢中執行select子句或操作表的順序;

執行順序從大到小執行;

當id值一樣的時候,執行順序由上往下;

select_type:表示查詢中每個select子句的型別(簡單or複雜),有以下幾種

? ******:查詢中不包含子查詢或者union

? primary:查詢中若包含任何複雜的子部分,最外層查詢則被標記為primary

? subquery:在select或where列表中包含了子查詢,該子查詢被標記為subquery

? derived:在from列表中包含的子查詢被標記為derived(衍生)

? 若第二個select出現在union之後,則被標記為union;

? 若union包含在from子句的子查詢中,外層select將被標記為:derived

? 從union表獲取結果的select被標記為:union result

type表示mysql在表中找到所需行的方式,又稱「訪問型別」,常見有以下幾種

? all:full table scan, mysql將進行全表掃瞄;

? index:full index scan,index與all區別為index型別只遍歷索引樹;

? range:range index scan,對索引的掃瞄開始於某一點,返回匹配值域的行,常見於between、等的查詢;

? ref:非唯一性索引掃瞄,返回匹配摸個單獨值的所有行。常見於使用非唯一索引或唯一索引的非唯一字首進行的查詢;

? eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄

? const、system:當mysql對查詢某部分進行優化,並轉換為乙個常量時,使用這些型別訪問。如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量

? null:mysql在優化過程中分解語句,執行時甚至不用訪問表或索引

possible_keys指出mysql能使用哪個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用;

key:顯示mysql在查詢中實際使用的索引,若沒有使用索引,顯示為null。當查詢中若使用了覆蓋索引,則該索引僅出現在key列表中

key_len:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度

ref:表示上述表的連線匹配條件,即那些列或常量被用於查詢索引列上的值;

rows:表示mysql根據表統計資訊及索引選用情況,估算的找到所需的記錄所需要讀取的行數;

extra:包含不適合在其他列中顯示但十分重要的額外資訊;

? using where:表示mysql伺服器在儲存引擎受到記錄後進行「後過濾」(post-filter),如果查詢未能使用索引,using where的作用只是提醒我們mysql將用where子句來過濾結果集

? using temporary:表示mysql需要使用臨時表來儲存結果集,常見於排序和分組查詢;

? using filesort:mysql中無法利用索引完成的排序操作稱為「檔案排序」;

2.3 mysql執行計畫的侷限

explain不會告訴你關於觸發器、儲存過程的資訊或使用者自定義函式對查詢的影響情況

explain不考慮各種cache

explain不能顯示mysql在執行查詢時所作的優化工作

部分統計資訊是估算的,並非精確值

expalin只能解釋select操作,其他操作要重寫為select後檢視執行計畫

3、 對於非select語句檢視執行計畫

在實際的工作中也經常需要檢視一些諸如update、delete的執行計畫,(mysql5.6的版本已經支援直接檢視)但是這時候並不能直接通過explain來進行檢視,而需要通過改寫語句進行檢視執行計畫;

在乙個生產資料庫的慢查詢日誌發現有條語句如下:

count: 13 time=73.44s (954s) lock=0.00s (0s) rows=0.0 (0), ipos[ipos]@2hosts

update ipos_zdjhd m,ipos_zdjhdtj tj set m.qr=n,m.qrrq='s',m.qrr='s',tj.qr=n,tj.qrrq='s'

where m.ydjh='s' and tj.djbh='s'

可以改寫如下:

explain select m.qr , m.qrr , tj.qr , tj.qrrq from ipos_zdjhd m,ipos_zdjhdtj tj where m.ydjh='17233' and tj.djbh='48632';

馬上可以發現ipos_zdjhd表進行了全表掃瞄,而ipos_zdjhd表有1076971行的資料,所以整個update的操作肯定是乙個很慢的過程,經過和開發人員溝通後,在ipos_zdjhd表增加相應的索引便讓整個過程提公升了500倍。

小結:執行計畫加上慢查詢日誌組成了mysql調優過程的一組調優利器,當資料庫穩定過後引數的調優是很少的一部分,80%以上的調優都會是sql調優。

oracle技術部落格:oracle 獵人筆記 資料庫技術群:367875324 (請備註資料庫管理 )

MYSQL檢視執行計畫

1 概述 執行計畫的檢視是進行資料庫的sql語句調優時依據的乙個重要依據,mysql的執行計畫檢視相對oracle簡便很多,功能也相對簡單很多的sql語句都不能直接檢視。2 執行計畫的生成和檢視 2.1 執行計畫的生成方法 explain select 生成的方法很簡單在相應的select前面加ex...

mysql檢視執行計畫

檢視執行計畫的目的 優化sql效能 測試版本 mysql5.7 首推官網文件,有對照表 測試表結構 create table test index1 int 11 not null,index2 int 11 not null,value varchar 255 not null default p...

MYSQL檢視執行計畫

1 概述 執行計畫的檢視是進行資料庫的sql語句調優時依據的乙個重要依據,mysql的執行計畫檢視相對oracle簡便很多,功能也相對簡單很多的sql語句都不能直接檢視。本文件整理了mysql執行計畫的生成方法和檢視。2 執行計畫的生成和檢視 2.1 執行計畫的生成方法 explain select...