mysql調(diào)優(yōu)-執(zhí)行計(jì)劃

mysql執(zhí)行計(jì)劃

在企業(yè)的應(yīng)用場(chǎng)景中江解,為了知道優(yōu)化SQL語(yǔ)句的執(zhí)行设预,需要查看SQL語(yǔ)句的具體執(zhí)行過(guò)程鳖枕,以加快SQL語(yǔ)句的執(zhí)行效率。

可以使用explain+SQL語(yǔ)句來(lái)模擬優(yōu)化器執(zhí)行SQL查詢(xún)語(yǔ)句灭翔,從而知道m(xù)ysql是如何處理sql語(yǔ)句的魏烫。

官網(wǎng)地址: https://dev.mysql.com/doc/refman/5.5/en/explain-output.html

1、執(zhí)行計(jì)劃中包含的信息

Column Meaning
id The SELECT identifier
select_type The SELECT type
table The table for the output row
partitions The matching partitions
type The join type
possible_keys The possible indexes to choose
key The index actually chosen
key_len The length of the chosen key
ref The columns compared to the index
rows Estimate of rows to be examined
filtered Percentage of rows filtered by table condition
extra Additional information

id

select查詢(xún)的序列號(hào)肝箱,包含一組數(shù)字哄褒,表示查詢(xún)中執(zhí)行select子句或者操作表的順序

id號(hào)分為三種情況:

1、如果id相同狭园,那么執(zhí)行順序從上到下

2读处、如果id不同,如果是子查詢(xún)唱矛,id的序號(hào)會(huì)遞增罚舱,id值越大優(yōu)先級(jí)越高,越先被執(zhí)行

3绎谦、id相同和不同的管闷,同時(shí)存在:相同的可以認(rèn)為是一組,從上往下順序執(zhí)行窃肠,在所有組中包个,id值越大,優(yōu)先級(jí)越高冤留,越先執(zhí)行

image.png

select_type

主要用來(lái)分辨查詢(xún)的類(lèi)型碧囊,是普通查詢(xún)還是聯(lián)合查詢(xún)還是子查詢(xún)

select_type 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
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)

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n91" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">--sample:簡(jiǎn)單的查詢(xún),不包含子查詢(xún)和union
explain select * from emp;

--primary:查詢(xún)中若包含任何復(fù)雜的子查詢(xún)纤怒,最外層查詢(xún)則被標(biāo)記為Primary
explain select staname,ename supname from (select ename staname,mgr from emp) t join emp on t.mgr=emp.empno ;

--union:若第二個(gè)select出現(xiàn)在union之后趁啸,則被標(biāo)記為union
explain select * from emp where deptno = 10 union select * from emp where sal >2000;

--dependent union:跟union類(lèi)似迅脐,此處的depentent表示union或union all聯(lián)合而成的結(jié)果會(huì)受外部表影響
explain select * from emp e where e.empno in ( select empno from emp where deptno = 10 union select empno from emp where sal >2000)

--union result:從union表獲取結(jié)果的select
explain select * from emp where deptno = 10 union select * from emp where sal >2000;

--subquery:在select或者where列表中包含子查詢(xún)
explain select * from emp where sal > (select avg(sal) from emp) ;

--dependent subquery:subquery的子查詢(xún)要受到外部表查詢(xún)的影響
explain select * from emp e where e.deptno in (select distinct deptno from dept);

--DERIVED: from子句中出現(xiàn)的子查詢(xún)雄卷,也叫做派生類(lèi)优床,
explain select staname,ename supname from (select ename staname,mgr from emp) t join emp on t.mgr=emp.empno ;

--UNCACHEABLE SUBQUERY:表示使用子查詢(xún)的結(jié)果不能被緩存
explain select * from emp where empno = (select empno from emp where deptno=@@sort_buffer_size);

--uncacheable union:表示union的查詢(xún)結(jié)果不能被緩存:sql語(yǔ)句未驗(yàn)證</pre>

table

對(duì)應(yīng)行正在訪(fǎng)問(wèn)哪一個(gè)表像寒,表名或者別名,可能是臨時(shí)表或者union合并結(jié)果集 1瓜贾、如果是具體的表名诺祸,則表明從實(shí)際的物理表中獲取數(shù)據(jù),當(dāng)然也可以是表的別名

2祭芦、表名是derivedN的形式筷笨,表示使用了id為N的查詢(xún)產(chǎn)生的衍生表

3、當(dāng)有union result的時(shí)候实束,表名是union n1,n2等的形式奥秆,n1,n2表示參與union的id

type

type顯示的是訪(fǎng)問(wèn)類(lèi)型,訪(fǎng)問(wèn)類(lèi)型表示我是以何種方式去訪(fǎng)問(wèn)我們的數(shù)據(jù)咸灿,最容易想的是全表掃描构订,直接暴力的遍歷一張表去尋找需要的數(shù)據(jù),效率非常低下避矢,訪(fǎng)問(wèn)的類(lèi)型有很多悼瘾,效率從最好到最壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般情況下,得保證查詢(xún)至少達(dá)到range級(jí)別审胸,最好能達(dá)到ref

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n100" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">--all:全表掃描亥宿,一般情況下出現(xiàn)這樣的sql語(yǔ)句而且數(shù)據(jù)量比較大的話(huà)那么就需要進(jìn)行優(yōu)化。
explain select * from emp;

--index:全索引掃描這個(gè)比all的效率要好砂沛,主要有兩種情況烫扼,一種是當(dāng)前的查詢(xún)時(shí)覆蓋索引,即我們需要的數(shù)據(jù)在索引中就可以索取碍庵,或者是使用了索引進(jìn)行排序映企,這樣就避免數(shù)據(jù)的重排序
explain select empno from emp;

--range:表示利用索引查詢(xún)的時(shí)候限制了范圍,在指定范圍內(nèi)進(jìn)行查詢(xún)静浴,這樣避免了index的全索引掃描堰氓,適用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()
explain select * from emp where empno between 7000 and 7500;

--index_subquery:利用索引來(lái)關(guān)聯(lián)子查詢(xún),不再掃描全表
explain select * from emp where emp.job in (select job from t_job);

--unique_subquery:該連接類(lèi)型類(lèi)似與index_subquery,使用的是唯一索引
explain select * from emp e where e.deptno in (select distinct deptno from dept);

--index_merge:在查詢(xún)過(guò)程中需要多個(gè)索引組合使用苹享,沒(méi)有模擬出來(lái)

--ref_or_null:對(duì)于某個(gè)字段即需要關(guān)聯(lián)條件双絮,也需要null值的情況下,查詢(xún)優(yōu)化器會(huì)選擇這種訪(fǎng)問(wèn)方式
explain select * from emp e where e.mgr is null or e.mgr=7369;

--ref:使用了非唯一性索引進(jìn)行數(shù)據(jù)的查找
create index idx_3 on emp(deptno);
explain select * from emp e,dept d where e.deptno =d.deptno;

--eq_ref :使用唯一性索引進(jìn)行數(shù)據(jù)查找
explain select * from emp,emp2 where emp.empno = emp2.empno;

--const:這個(gè)表至多有一個(gè)匹配行得问,
explain select * from emp where empno = 7369;

--system:表只有一行記錄(等于系統(tǒng)表)囤攀,這是const類(lèi)型的特例,平時(shí)不會(huì)出現(xiàn)</pre>

possible_keys

顯示可能應(yīng)用在這張表中的索引宫纬,一個(gè)或多個(gè)抚岗,查詢(xún)涉及到的字段上若存在索引,則該索引將被列出哪怔,但不一定被查詢(xún)實(shí)際使用

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n103" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">explain select * from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10;</pre>

key

實(shí)際使用的索引宣蔚,如果為null,則沒(méi)有使用索引认境,查詢(xún)中若使用了覆蓋索引胚委,則該索引和查詢(xún)的select字段重疊。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n106" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">explain select * from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10;</pre>

key_len

表示索引中使用的字節(jié)數(shù)叉信,可以通過(guò)key_len計(jì)算查詢(xún)中使用的索引長(zhǎng)度亩冬,在不損失精度的情況下長(zhǎng)度越短越好。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n109" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">explain select * from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10;</pre>

ref

顯示索引的哪一列被使用了硼身,如果可能的話(huà)硅急,是一個(gè)常數(shù)

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n112" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">explain select * from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10;</pre>

rows

根據(jù)表的統(tǒng)計(jì)信息及索引使用情況,大致估算出找出所需記錄需要讀取的行數(shù)佳遂,此參數(shù)很重要营袜,直接反應(yīng)的sql找了多少數(shù)據(jù),在完成目的的情況下越少越好

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n115" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">explain select * from emp;</pre>

extra

包含額外的信息丑罪。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="sql" cid="n118" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">--using filesort:說(shuō)明mysql無(wú)法利用索引進(jìn)行排序荚板,只能利用排序算法進(jìn)行排序,會(huì)消耗額外的位置
explain select * from emp order by sal;

--using temporary:建立臨時(shí)表來(lái)保存中間結(jié)果吩屹,查詢(xún)完成之后把臨時(shí)表刪除
explain select ename,count(*) from emp where deptno = 10 group by ename;

--using index:這個(gè)表示當(dāng)前的查詢(xún)時(shí)覆蓋索引的跪另,直接從索引中讀取數(shù)據(jù),而不用訪(fǎng)問(wèn)數(shù)據(jù)表煤搜。如果同時(shí)出現(xiàn)using where 表名索引被用來(lái)執(zhí)行索引鍵值的查找免绿,如果沒(méi)有,表面索引被用來(lái)讀取數(shù)據(jù)擦盾,而不是真的查找
explain select deptno,count(*) from emp group by deptno limit 10;

--using where:使用where進(jìn)行條件過(guò)濾
explain select * from t_user where id = 1;

--using join buffer:使用連接緩存嘲驾,情況沒(méi)有模擬出來(lái)

--impossible where:where語(yǔ)句的結(jié)果總是false
explain select * from emp where empno = 7469;</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厌衙,隨后出現(xiàn)的幾起案子距淫,更是在濱河造成了極大的恐慌,老刑警劉巖婶希,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕暇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喻杈,警方通過(guò)查閱死者的電腦和手機(jī)彤枢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筒饰,“玉大人缴啡,你說(shuō)我怎么就攤上這事〈擅牵” “怎么了业栅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵秒咐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碘裕,道長(zhǎng)携取,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任帮孔,我火速辦了婚禮雷滋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘文兢。我一直安慰自己晤斩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布姆坚。 她就那樣靜靜地躺著澳泵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旷偿。 梳的紋絲不亂的頭發(fā)上烹俗,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音萍程,去河邊找鬼幢妄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛茫负,可吹牛的內(nèi)容都是我干的蕉鸳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忍法,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潮尝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饿序,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤勉失,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后原探,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乱凿,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年咽弦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徒蟆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡型型,死狀恐怖段审,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闹蒜,我是刑警寧澤寺枉,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布抑淫,位于F島的核電站,受9級(jí)特大地震影響型凳,放射性物質(zhì)發(fā)生泄漏丈冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一甘畅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧往弓,春花似錦疏唾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撇寞,卻和暖如春顿天,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔑担。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工牌废, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啤握。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓鸟缕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親排抬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懂从,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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