學(xué)會(huì)使用`EXPLAIN`

引言

日常工作中调窍,使用MySQL的機(jī)會(huì)還是蠻多的低淡,主要考慮Schema與數(shù)據(jù)類型優(yōu)化台谢、如何創(chuàng)建索引寻狂、根據(jù)業(yè)務(wù)場(chǎng)景的查詢優(yōu)化。這些想必大家都在高性能MySQL這本書中看過朋沮,可能也比作者理解的深荆虱,本文旨在對(duì)EXPLAIN語句使用、分析進(jìn)行整理。

EXPLAIN語句是什么怀读?

官網(wǎng)對(duì)于EXPLAIN的作用定義如下:

The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLACE, and UPDATE statements.

簡單來講,EXPLAIN語句告訴我們MySQL如何執(zhí)行SQL語句骑脱,而我們通過這些信息菜枷,可以達(dá)到優(yōu)化SQL語句執(zhí)行效率的目的。

接下來叁丧,就要對(duì)EXPLAIN返回的格式進(jìn)行了解了啤誊,具體如下:

字段名 字段描述
id 查詢語句內(nèi)SELECT的序列號(hào)
select_type SELECT類型
table 訪問的表名
partitions 命中分區(qū)
type 數(shù)據(jù)訪問類型,下文詳細(xì)介紹
possible_keys 有關(guān)索引拥娄,實(shí)際情況可能不可用
key MySQL查詢優(yōu)化器實(shí)際使用的索引
key_len 索引存儲(chǔ)長度
ref 實(shí)際使用的索引中蚊锹,用于比較的常量或列
rows 查詢需要讀取的行數(shù),innodb引擎是一個(gè)衡量效率的指標(biāo)稚瘾,有時(shí)可能不準(zhǔn)確
Extra 查詢執(zhí)行的附加信息牡昆,下文詳細(xì)介紹
  • 在分析SQL語句執(zhí)行時(shí),主要用到的列摊欠,分別為type丢烘、Extra,下文的測(cè)試用例均為官網(wǎng)提供的sakila數(shù)據(jù)庫些椒,附上下載鏈接播瞳。

  • 本文使用MySQL 8.0.12、Navicat 12.1

type列主要出現(xiàn)值(性能從好到差)

  • system:表只有一行免糕,const類型的特殊情況赢乓。
  • const:查詢結(jié)果最多有一行,多為主鍵石窑、唯一索引與常量比較的情況牌芋。
explain select * from actor where actor_id = 1
  • eq_ref:一種特殊的索引查找,MySQL知道最多只返回一條符合條件的記錄尼斧,使用主鍵姜贡、NOT NULL的唯一索引會(huì)看到(用navicat發(fā)現(xiàn)結(jié)果也是ref)。
explain select * from actor, film_actor where actor.actor_id = film_actor.actor_id and actor.actor_id = 1
  • ref:一種索引查找棺棵,返回所有匹配某個(gè)單個(gè)值的行楼咳,然而,可能會(huì)找到多個(gè)符合條件的行烛恤,當(dāng)使用非唯一性索引或者唯一性索引的非唯一性前綴時(shí)發(fā)生母怜。
explain select * from film where title= 'ACE GOLDFINGER'
  • range:范圍掃描就是一個(gè)有限制的索引掃描, 不用遍歷所有索引缚柏,例如索引在BETWEEN苹熏、>>范圍內(nèi)的。
explain select * from film where film_id BETWEEN 1 AND 100
  • index:全表掃描轨域,只是MySQL掃描表時(shí)按索引次序而不是行袱耽。

Extra列中看到“Using index”,說明是覆蓋索引干发,只需要讀取索引列朱巨,不需要讀取行數(shù)據(jù)。
使用索引次序全表讀取枉长。

explain select actor.actor_id from film_actor, actor where film_actor.actor_id = actor.actor_id 
  • ALL:全表掃描冀续,讀取行數(shù)據(jù),找到需要的行必峰。
explain select * from film_actor, actor where film_actor.actor_id = actor.actor_id 

Extra列主要出現(xiàn)的值

  • Using index:使用覆蓋索引洪唐,避免回表查詢行數(shù)據(jù)。
  • Using where:存儲(chǔ)引擎檢索行后再進(jìn)行過濾吼蚁。
  • Using temporary:對(duì)查詢結(jié)果排序時(shí)會(huì)使用一個(gè)臨時(shí)表凭需,盡量避免使用臨時(shí)表
  • Using filesort:對(duì)結(jié)果使用一個(gè)外部索引排序桂敛,而不是按索引次序從表里讀取行功炮,需要進(jìn)行優(yōu)化

總結(jié)

由于查詢優(yōu)化器的存在术唬,實(shí)際運(yùn)行查詢語句會(huì)和想的不一致薪伏,因此在進(jìn)行查詢語句優(yōu)化時(shí),最好運(yùn)行下EXPLAIN語句粗仓,看看是不是和自己想的一致嫁怀。

參考文獻(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市借浊,隨后出現(xiàn)的幾起案子塘淑,更是在濱河造成了極大的恐慌,老刑警劉巖蚂斤,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存捺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曙蒸,警方通過查閱死者的電腦和手機(jī)捌治,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽窟,“玉大人肖油,你說我怎么就攤上這事”鄹郏” “怎么了森枪?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵视搏,是天一觀的道長。 經(jīng)常有香客問我县袱,道長浑娜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任式散,我火速辦了婚禮棚愤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杂数。我一直安慰自己,他們只是感情好瘸洛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布揍移。 她就那樣靜靜地躺著,像睡著了一般反肋。 火紅的嫁衣襯著肌膚如雪那伐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天石蔗,我揣著相機(jī)與錄音罕邀,去河邊找鬼。 笑死养距,一個(gè)胖子當(dāng)著我的面吹牛诉探,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棍厌,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肾胯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了耘纱?” 一聲冷哼從身側(cè)響起敬肚,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎束析,沒想到半個(gè)月后艳馒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡员寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年弄慰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁恭。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曹动,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牲览,到底是詐尸還是另有隱情墓陈,我是刑警寧澤恶守,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站贡必,受9級(jí)特大地震影響兔港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仔拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一衫樊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧利花,春花似錦科侈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挠乳,卻和暖如春权薯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睡扬。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工盟蚣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卖怜。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓屎开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親韧涨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牍戚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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