Explain語句

序言

? Explain語句提供了mysql如何執(zhí)行語句的信息攒至,包括select,delete,insert, replace, update

Explain輸出的列

Column JSON Name Meaning
id select_id The SELECT identifier
select_type None The SELECT type
table table_name The table for the output row
partitions partitions The matching partitions
type access_type The join type
possible_keys possible_keys The possible indexes to choose
key key The index actually chosen
key_len key_length The length of the chosen key
ref ref The columns compared to the index
rows rows Estimate(估算) of rows to be examined(檢查)
filtered filtered Percentage(百分比) of rows filtered(過濾) by table condition
Extra None Additional information

select_type

select的類型竖幔,包含如下值:

Value Meaning
SIMPLE Simple SELECT (not using UNION or subqueries)
PRIMARY Outermost SELECT
UNION Second or later SELECT statement in a UNION
DEPENDENT UNION Second or later SELECT statement in a UNION, dependent on outer query
UNION RESULT Result of a UNION.
SUBQUERY First SELECT in subquery
DEPENDENT SUBQUERY First SELECT in subquery, dependent on outer query
DERIVED Derived table
DEPENDENT DERIVED Derived table dependent on another table
MATERIALIZED Materialized subquery
UNCACHEABLE SUBQUERY A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
UNCACHEABLE UNION The second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLE SUBQUERY)

type

? 順序從好到差依次介紹如下:

  • system:表只有一行惭墓。systemconst的特例

  • constconst用于將主鍵或唯一索引的所有部分與常量值進行=測試,表最多有一個匹配行

    SELECT * FROM tbl_name WHERE primary_key=1;
    
    SELECT * FROM tbl_name
      WHERE primary_key_part1=1 AND primary_key_part2=2;
      
    --上述查詢是const類型的 
    
  • eq_ref:多表聯(lián)結(jié)中使用primary key或者 unique not null的列,進行=測試,比較值可以是常量嵌灰,也可以是在該表之前讀取的表中的列的表達式

    SELECT * FROM ref_table,other_table
      WHERE ref_table.key_column=other_table.column;
    
    SELECT * FROM ref_table,other_table
      WHERE ref_table.key_column_part1=other_table.column
      AND ref_table.key_column_part2=1;
      
    --上述查詢是eq_ref類型的 
    
    create table table_0(id_0 bigint primary key, v_0 int, index(v_0));
    create table table_1(id_1 bigint primary key, v_1 int, index(v_1));
    
    insert into table_0(id_0, v_0) values (0, 1), (1, 2);
    insert into table_1(id_1, v_1) values (0, 1), (1, 2);
    
    explain SELECT * from table_0, table_1 where table_0.id_0 = table_1.id_1
    
    id select_type table partitions type possible_keys key key_len ref rows filtered extra
    1 simple table_0 null index primary v_0 5 null 2 100 using index
    1 simple table_1 null eq_ref primary primary 8 szn.table_0.id+0 1 100 null
  • ref:類似于eq_refref操作的索引不是primary key或者 unique not null颅悉,所以返回的行數(shù)可能大于1行(在索引列上使用的依然是=操作)

    SELECT * FROM ref_table WHERE key_column=expr;
    
    SELECT * FROM ref_table,other_table
      WHERE ref_table.key_column=other_table.column;
    
    SELECT * FROM ref_table,other_table
      WHERE ref_table.key_column_part1=other_table.column
      AND ref_table.key_column_part2=1;
      
    --上述查詢是ref類型的 
    
    explain SELECT * from table_0, table_1 where table_0.v_0 = table_1.v_1
    --表結(jié)構(gòu)及包含的數(shù)據(jù)同eq_ref時舉的例子
    
    id select_type table partitions type possible_keys key key_len ref rows filtered extra
    1 simple table_0 null index v_0 v_0 5 null 2 100 Using where; Using index
    1 simple table_1 null ref v_1 v_1 5 szn.table_0.id+0 1 100 Using index
  • fulltext:使用全文索引

  • ref_or_null:類似于ref沽瞭,但是增加了搜索行是否為空的條件

    SELECT * FROM ref_table
      WHERE key_column=expr OR key_column IS NULL;
    
    --上述查詢是ref_or_null類型的 
    
  • index_merge:索引合并優(yōu)化被使用

  • unique_subquery:在以下形式的in子查詢中,unique_subquery代替了eq_ref

    value IN (SELECT primary_key FROM single_table WHERE some_expr)
    
  • index_subquery:類似于unique_subquery剩瓶,但是作用的index不是唯一索引

    value IN (SELECT key_column FROM single_table WHERE some_expr)
    
  • range:使用索引來檢索一個范圍的行驹溃,支持的操作符:=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()

    SELECT * FROM tbl_name
      WHERE key_column = 10;
    
    SELECT * FROM tbl_name
      WHERE key_column BETWEEN 10 and 20;
    
    SELECT * FROM tbl_name
      WHERE key_column IN (10,20,30);
    
    SELECT * FROM tbl_name
      WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
    
  • index:將掃描索引樹,有二種情況:

    • 如果查詢的索引是覆蓋索引延曙,則只有索引樹被掃描(速度很快)豌鹤。Extra列顯示using index
    • 以索引順序搂鲫,通過讀取的索引傍药,執(zhí)行全表掃描來尋找數(shù)據(jù)磺平。Extra列不會顯示using index
  • all:執(zhí)行全表掃描魂仍。應(yīng)盡量避免這種類型

key

  • mysql實際決定使用的key
  • 有可能不會出現(xiàn)在possible_keys的列表中

ref

? ref指明了和key比較的是那一列或者常量

create table table_0(id_0 bigint primary key, v_0 int, index(v_0));
insert into table_0(id_0, v_0) values (0, 1), (1, 2);

explain SELECT * from table_0 where table_0.id_0 = 1
--ref列拐辽,值為 const

explain SELECT * from table_0 where id_0 = v_0
--ref列,值為 v_0

rows

  • mysql認(rèn)為執(zhí)行查詢必須檢查的行數(shù)
  • 對于Innodb擦酌,這個值是一個估算值俱诸,并不準(zhǔn)確

filtered

  • 根據(jù)查詢條件,未過濾的行數(shù)的百分比
  • 100表示未進行過濾
  • 此值是一個預(yù)估值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赊舶,一起剝皮案震驚了整個濱河市睁搭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笼平,老刑警劉巖园骆,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寓调,居然都是意外死亡锌唾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門夺英,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晌涕,“玉大人,你說我怎么就攤上這事痛悯∮嗬瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵载萌,是天一觀的道長惧财。 經(jīng)常有香客問我,道長扭仁,這世上最難降的妖魔是什么可缚? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮斋枢,結(jié)果婚禮上帘靡,老公的妹妹穿的比我還像新娘。我一直安慰自己瓤帚,他們只是感情好描姚,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戈次,像睡著了一般轩勘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怯邪,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天绊寻,我揣著相機與錄音,去河邊找鬼。 笑死澄步,一個胖子當(dāng)著我的面吹牛冰蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播村缸,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼祠肥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梯皿?” 一聲冷哼從身側(cè)響起仇箱,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎东羹,沒想到半個月后剂桥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡属提,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年渊额,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垒拢。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡旬迹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出求类,到底是詐尸還是另有隱情奔垦,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布尸疆,位于F島的核電站椿猎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寿弱。R本人自食惡果不足惜犯眠,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症革。 院中可真熱鬧筐咧,春花似錦、人聲如沸噪矛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艇挨。三九已至残炮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缩滨,已是汗流浹背势就。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工泉瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苞冯。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓袖牙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抱完。 傳聞我的和親對象是個殘疾皇子贼陶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容