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...