Mysql Explain之type詳解

select version():5.7.21

EXPLAIN 是什么

MySQL 提供了一個 EXPLAIN 命令, 它可以對 SQL 語句進行分析, 并輸出 SQL 執(zhí)行的詳細(xì)信息, 以供開發(fā)人員針對性優(yōu)化.

例如分析一條 SELECT 語句

EXPLAIN SELECT * FROM `user` WHERE id = 1 
explain-type

EXPLAIN 結(jié)果中的type字段

Tips:常見的掃描方式

  • system:系統(tǒng)表诊霹,少量數(shù)據(jù)漩氨,往往不需要進行磁盤IO
  • const:常量連接
  • eq_ref:主鍵索引(primary key)或者非空唯一索引(unique not null)等值掃描
  • ref:非主鍵非唯一索引等值掃描
  • range:范圍掃描
  • index:索引樹掃描
  • ALL:全表掃描(full table scan)

type掃描方式由快到慢

system > const > eq_ref > ref > range > index > ALL

1.system

explain-type

ar414

上例中御铃,從系統(tǒng)庫mysql的系統(tǒng)標(biāo)proxies_priv里查詢數(shù)據(jù)父款,這里的數(shù)據(jù)在Mysql服務(wù)啟動時候已經(jīng)加載在內(nèi)存中贬墩,不需要進行磁盤IO因妇。

官方文檔中的解釋:該表只有一行(=系統(tǒng)表)悼沿。這是const聯(lián)接類型的特例

2.const

模擬數(shù)據(jù)
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
Explain分析結(jié)果
explain-type

上例中id是主鍵(primary key)丧叽,連接部分是常量1,通過索引一次就能找到期虾,速度非吃快

場景:

  • 命中主鍵(primary key)或者唯一索引(unique)
  • 被連接的部分是一個常量值(const)

3.eq_ref

模擬數(shù)據(jù)
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int primary key,
  balance int
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);
Explain分析結(jié)果
explain-type

上例中對于前表user表中的每一行(row),對應(yīng)后user_balance表只有一行被掃描镶苞,這類掃描的速度也非常的快

場景:

  1. 聯(lián)表(join)查詢
  2. 命中主鍵(primary key)或者非空唯一索引(unique not null)
  3. 等值連接

4.ref

模擬數(shù)據(jù)

同eq_ref模擬數(shù)據(jù)區(qū)別:user_balance表中的主鍵索引改為普通索引

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int,
  balance int,
  index(uid)
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);
Explain分析結(jié)果

聯(lián)表查詢

explain-type

由于后表使用了普通非唯一索引喳坠,對于前表user表的每一行(row),后表user_balance表可能有多于一行的數(shù)據(jù)被掃描

單表查詢

explain-type

當(dāng)id改為普通非唯一索引后茂蚓,常量的連接查詢壕鹉,也由const降級為了ref剃幌,因為非唯一索引所以有多于一行的數(shù)據(jù)被可能被掃描

ref每一次匹配可能有多行數(shù)據(jù)返回,雖然它比eq_ref要慢晾浴,但它仍然是一個很快的join類型

場景:

  • 聯(lián)表查詢
  • 普通非唯一索引

5.range

模擬數(shù)據(jù)
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');
Explain分析結(jié)果

between

explain-type

in

explain-type

>,>=,<,<=

explain-type

range比較好理解负乡,它是索引上的范圍查詢,它會在索引上掃碼特定范圍內(nèi)的值

6.index

話外音:當(dāng)前測試表為InnoDb脊凰,MyISAM 內(nèi)置了一個計數(shù)器抖棘,count()時它直接從計數(shù)器中讀

explain-type

index類型,需要掃描索引上的全部數(shù)據(jù)狸涌,它僅比全表掃描快一點

7.ALL

模擬數(shù)據(jù)
create table user (
  id int,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');
Explain分析結(jié)果
explain-type

如果id上不建索引,則全表掃描

總結(jié)

  • type類型從快到慢:system>const>eq_ref>ref>range>index>ALL
  • 作為一名合格的后端開發(fā)者應(yīng)該熟悉掌握Explain
  • 結(jié)合業(yè)務(wù)建立正確索引切省,而不是每個字段建立索引(濫用)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帕胆,隨后出現(xiàn)的幾起案子朝捆,更是在濱河造成了極大的恐慌,老刑警劉巖懒豹,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芙盘,死亡現(xiàn)場離奇詭異,居然都是意外死亡歼捐,警方通過查閱死者的電腦和手機何陆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豹储,“玉大人贷盲,你說我怎么就攤上這事“郏” “怎么了巩剖?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钠怯。 經(jīng)常有香客問我佳魔,道長,這世上最難降的妖魔是什么晦炊? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任鞠鲜,我火速辦了婚禮,結(jié)果婚禮上断国,老公的妹妹穿的比我還像新娘贤姆。我一直安慰自己,他們只是感情好稳衬,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布霞捡。 她就那樣靜靜地躺著,像睡著了一般薄疚。 火紅的嫁衣襯著肌膚如雪碧信。 梳的紋絲不亂的頭發(fā)上赊琳,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音砰碴,去河邊找鬼躏筏。 笑死,一個胖子當(dāng)著我的面吹牛呈枉,可吹牛的內(nèi)容都是我干的寸士。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碴卧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乃正?” 一聲冷哼從身側(cè)響起住册,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓮具,沒想到半個月后荧飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡名党,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年叹阔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传睹。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耳幢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欧啤,到底是詐尸還是另有隱情睛藻,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布邢隧,位于F島的核電站店印,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倒慧。R本人自食惡果不足惜按摘,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纫谅。 院中可真熱鬧炫贤,春花似錦、人聲如沸系宜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盹牧。三九已至俩垃,卻和暖如春励幼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背口柳。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工苹粟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跃闹。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓嵌削,卻偏偏與公主長得像,于是被迫代替她去往敵國和親望艺。 傳聞我的和親對象是個殘疾皇子苛秕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354