mysql之expain執行計畫詳解

2021-10-02 04:13:06 字數 4125 閱讀 4573

mysql之expain執行計畫詳解

explain select * from user where name = '張三'

expain出來的資訊有12列,分別是id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、extra

具體描述:

id:選擇識別符號

select_type:表示查詢的型別。

table:輸出結果集的表

partitions:匹配的分割槽

type:表示表的連線型別     

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

key:表示實際使用的索引

key_len:索引欄位的長度

ref:列與索引的比較

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

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

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

具體講解幾個重要引數

1、type

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

常用的型別有:all、index、range、 ref、eq_ref、const、system、null(從左到右,效能從差到好)

all:full table scan, mysql將遍歷全表以找到匹配的行。當查詢欄位或where條件沒有建立索引,就會走全盤掃瞄

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

range:只檢索給定範圍的行,使用乙個索引來選擇行。當使用=、<>、>、>=、、like、between或者in操作符,用常量比較關鍵字列時,可以使用range

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

eq_ref:類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連線中使用primary key或者 unique key作為關聯條件

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

null:mysql在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從乙個索引列裡選取最小值可以通過單獨索引查詢完成。當使用max,min函式時會用到

例子:range(範圍):

null(常量):

或者explain select * from user as u,user_account as ua where u.id = ua.user_id and ua.id = 1

eq_ref(多表關聯查詢,關聯欄位為唯一索引):

ref(多表關聯查詢,關聯欄位為普通索引)

重點說明:在做where條件範圍查詢、order by 排序、group by中,select * 會導致索引失效,原因是索引最多使用乙個,不是查詢出的字段都建立索引,所以導致會全盤掃瞄表,最好使用組合索引。

當查詢條件是select * ,那麼在做range範圍查詢、order by 、group by時候不走索引,mysql走全盤掃瞄,當乙個是當查詢條件是select id,age,那麼在做range範圍查詢時候會走索引,不會全盤掃瞄

結果如下:索引失效

或者explain select * from user order by age;

結果如下:索引有效

或者explain select id,age from user order by age;

2、extra

using where:不用讀取表中所有資訊,僅通過索引就可以獲取所需資料,這發生在對錶的全部的請求列都是同乙個索引的部分的時候,表示mysql伺服器將在儲存引擎檢索行後再進行過濾

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

using filesort:當query中包含 order by 操作,而且無法利用索引完成的排序操作稱為「檔案排序」

-- 測試extra的filesort

explain select * from user order by age;

using join buffer:改值強調了在獲取連線條件時沒有使用索引,並且需要連線緩衝區來儲存中間結果。如果出現了這個值,那應該注意,根據查詢的具體情況可能需要新增索引來改進能。

impossible where:這個值強調了where語句會導致沒有符合條件的行(通過收集統計資訊不可能存在結果)。

select tables optimized away:這個值意味著僅通過使用索引,優化器可能僅從聚合函式結果中返回一行

no tables used:query語句中使用from dual 或不含任何from子句

優化之EXPAIN執行計畫

準備測試資料 create tableactor idint 22 not null auto increment,namevarchar 255 default null,update timedatetime default null,primary key id engine innodb a...

mysql 生成執行計畫 MySQL的執行計畫

mysql的執行計畫 什麼是執行計畫?執行計畫通常是開發者優化sql語句的第一步。mysql在解析sql語句時,會生成多套執行方案,然後內部會進行乙個成本的計算,然後通過優化器選擇乙個最優的方案執行,然後根據這個方案會生成乙個執行計畫。開發者通過檢視sql語句的執行計畫,可以直觀的了解到mysql是...

Mysql中explain命令檢視執行計畫

explain select from xx id 一組資料,表示任務被執行的順序,序號越大的任務越先執行.select type 不包含任何子查詢或union等查詢 primary 包含子查詢最外層查詢就顯示為 primary subquery 在select或 where字句中包含的查詢 der...