TiDB執(zhí)行計(jì)劃(二)

接一篇TiDB執(zhí)行計(jì)劃(一)翁都,上一篇中主要介紹了執(zhí)行計(jì)劃中涉及到的算子耕蝉,今天把執(zhí)行計(jì)劃中剩余的東西講完

查詢計(jì)劃命令

EXPLAIN命令乾颁,可以查看TiDB執(zhí)行sql時(shí)的執(zhí)行計(jì)劃蜜氨,用法和mysql一樣炎滞,跟上sql即可

EXPLAIN  SQL語(yǔ)句

舉個(gè)栗子(脫敏數(shù)據(jù))

執(zhí)行 EXPLAIN

EXPLAIN 
select
  a0_.id,
  a0_.create_time,
  a0_.end_time,
  a0_.flow_id,
  a0_.campaign_id,
  a0_.unit_id,
  a0_.oa_id,
  a0_.org_path_,
  a0_.param,
  a0_.start_time,
  a0_.state,
  a0_.user_type,
  a0_.update_time,
  a0_.user_id
from
  table_a a0_
where
  a0_.campaign_id = 354361236223
  and a0_.user_id = 25325123
  and a0_.user_type = 1
  and a0_.param = '1'
limit
  1000

執(zhí)行計(jì)劃結(jié)果

執(zhí)行計(jì)劃結(jié)果

執(zhí)行計(jì)劃以一個(gè)樹(shù)形結(jié)構(gòu)展示出來(lái),來(lái)說(shuō)說(shuō)每一列的含義吧:

  • id 為算子舵匾,是執(zhí)行sql時(shí)俊抵,每一步需要執(zhí)行子任務(wù)
  • estRows為每一個(gè)子任務(wù)預(yù)估需要處理的行數(shù)
  • task為子任務(wù)執(zhí)行時(shí)候所在的位置
  • access-object子任務(wù)的對(duì)象,比如說(shuō)表坐梯、索引等
  • operator info子任務(wù)執(zhí)行時(shí)候的一些算是操作日志的信息吧

上一篇文章說(shuō)了算子徽诲,今天來(lái)說(shuō)下執(zhí)行計(jì)劃中,剩下這幾個(gè)字段estRows吵血、task谎替、access-objectoperator info的含義吧

estRows:為每一個(gè)子任務(wù)預(yù)估需要處理的行數(shù)
這個(gè)很容易理解蹋辅,就直接上栗子了
select
  user_id
from
  tablea a0_
GROUP by
  user_id

這個(gè)sql钱贯,對(duì)于索引列user_id使用了group by,導(dǎo)致了執(zhí)行時(shí)需要對(duì)所有索引數(shù)據(jù)進(jìn)行掃描侦另,會(huì)出現(xiàn)IndexFullScan算子秩命,執(zhí)行計(jì)劃如下:

estRows
  • 因?yàn)檫@個(gè)sql的執(zhí)行計(jì)劃是,先對(duì)于索引列user_id進(jìn)行了索引數(shù)據(jù)全量進(jìn)行掃描褒傅,使用了IndexFullScan算子弃锐,所以IndexFullScan_11這一步的算子的預(yù)估行數(shù)estRows是索引列user_id全量數(shù)據(jù)的數(shù)據(jù)量,133270314
  • 這個(gè)sql后一步的執(zhí)行是通過(guò)IndexReader算子對(duì)下層算子的數(shù)據(jù)進(jìn)行一個(gè)聚合樊卓,所以IndexReader_13算子的預(yù)估行數(shù)estRowsuser_id列 group by以后的數(shù)據(jù)拿愧,也就是873229.35了
task:為子任務(wù)執(zhí)行時(shí)候所在的位置
  • 為子任務(wù)執(zhí)行時(shí)候所在的位置
  • 主要有兩種
  • cop,是指使用TiKV中的Coprocessor執(zhí)行的計(jì)算任務(wù),支持大部分函數(shù)(包括聚合函數(shù)和標(biāo)量函數(shù))碌尔、LIMIT操作浇辜、索引掃描和表掃描
  • root,是指在TiDB中執(zhí)行的計(jì)算任務(wù),一般所有匯聚TiKV/TiFlash上掃描的數(shù)據(jù)或者計(jì)算結(jié)果的算子都只能作為roottask在TiDB上執(zhí)行,所有的Join操作都只能作為roottask在TiDB上執(zhí)行
  • TiDB的SQL優(yōu)化的目標(biāo)之一是將計(jì)算盡可能地下推到TiKV中執(zhí)行
舉個(gè)栗子

栗子1:聚合查詢栗子唾戚,使用COUNT

select
  COUNT(user_id)
from
  tablea a0_

這個(gè)sql柳洋,對(duì)于索引列user_id使用了COUNT函數(shù),導(dǎo)致了執(zhí)行時(shí)需要對(duì)所有索引數(shù)據(jù)進(jìn)行掃描叹坦,會(huì)出現(xiàn)IndexFullScan算子熊镣,執(zhí)行計(jì)劃如下:

COUNT函數(shù)
  • 對(duì)于索引列user_id使用了COUNT函數(shù),先會(huì)對(duì)索引列user_id進(jìn)行索引數(shù)據(jù)全量掃描募书,IndexFullScan_19算子的執(zhí)行位置為 cop[tikv]
  • 后續(xù)執(zhí)行SteamAgg_8算子時(shí)候绪囱,因?yàn)槭?聚合函數(shù),也會(huì)在 cop[tikv]上執(zhí)行
  • 最終的IndexReader_21算子對(duì)下層算子的數(shù)據(jù)進(jìn)行一個(gè)聚合莹捡,在root也就是TiDB中執(zhí)行

栗子2:聚合查詢栗子鬼吵,使用group by

select
  user_id
from
  tablea a0_
GROUP by
  user_id

這個(gè)sql,對(duì)于索引列user_id使用了group by篮赢,導(dǎo)致了執(zhí)行時(shí)需要對(duì)所有索引數(shù)據(jù)進(jìn)行掃描齿椅,會(huì)出現(xiàn)IndexFullScan算子琉挖,執(zhí)行計(jì)劃如下:

group by
  • 對(duì)于索引列user_id使用了group by,先會(huì)對(duì)索引列user_id進(jìn)行索引數(shù)據(jù)全量掃描涣脚,IndexFullScan_11算子的執(zhí)行位置為 cop[tikv]
  • 后續(xù)執(zhí)行HashAgg_5算子時(shí)候示辈,因?yàn)槭?code>group by,也會(huì)在 cop[tikv]上執(zhí)行
  • 最終的IndexReader_13算子對(duì)下層算子的數(shù)據(jù)進(jìn)行一個(gè)聚合遣蚀,在root也就是TiDB中執(zhí)行

栗子3:子查詢栗子矾麻,使用索引IN 子查詢,當(dāng)子查詢?yōu)槿繒r(shí)

select
  *
from
  tablea a0_
where
  user_id IN (
    select
      user_id
    from
      tablea
  )

這個(gè)sql妙同,對(duì)于索引列user_id使用了in射富,子查詢?yōu)槿頀呙瑁詴?huì)導(dǎo)致外層查詢會(huì)對(duì)索引列user_id進(jìn)行全索引數(shù)據(jù)進(jìn)行掃描粥帚,會(huì)出現(xiàn)IndexFullScan算子,執(zhí)行計(jì)劃如下:

IN 子查詢
  • 首先限次,子查詢沒(méi)有加條件芒涡,是一個(gè)全表掃描,看執(zhí)行計(jì)劃2的地方卖漫,出現(xiàn)了一個(gè)TableFullScan_49,由于子查詢是全量數(shù)據(jù)费尽,會(huì)在cop[tikv]上執(zhí)行
  • 聚合子查詢結(jié)果的TableReader_50會(huì)在root也就是TiDB中執(zhí)行
  • 看執(zhí)行計(jì)劃1的地方,當(dāng)外層sql對(duì)索引列user_id進(jìn)行In時(shí)候羊始,會(huì)對(duì)索引列user_id進(jìn)行全索引數(shù)據(jù)的掃描旱幼,IndexFullScan_40會(huì)在cop[tikv]上執(zhí)行
  • 同樣1位置的聚合算子IndexReader_42root也就是TiDB中執(zhí)行
  • 最終的HashJoin_22算子對(duì)下層算子的數(shù)據(jù)進(jìn)行一個(gè)聚合,在root也就是TiDB中執(zhí)行
access-object: 子任務(wù)的對(duì)象突委,比如說(shuō)表柏卤、索引等
這個(gè)很容易理解,就直接上栗子了
select
  * 
from
  tablea a1_
where
  a1_.user_id = 123214125

執(zhí)行計(jì)劃如下:

TableRowIDScan栗子
  • 看這個(gè)sql匀油,是一個(gè)通過(guò)索引列user_id進(jìn)行了索引范圍掃描缘缚,他的執(zhí)行邏輯是,先通過(guò)對(duì)于索引列user_id進(jìn)行了一個(gè)范圍掃描敌蚜,得到所有符合條件的rowId桥滨,然后通過(guò)rowId掃描表獲得數(shù)據(jù),看執(zhí)行也是弛车,首先在Build端齐媒,通過(guò)IndexRangeScan算子,對(duì)于索引列user_id進(jìn)行了范圍掃描纷跛,掃描到的rowId喻括,在Probe端,在通過(guò)TableRowIDScan算子,通過(guò)rowId掃描表獲取數(shù)據(jù)忽舟,最終通過(guò)IndexLookUp算子來(lái)匯聚最終的數(shù)據(jù)
  • 看這個(gè)sql執(zhí)行計(jì)劃的access-object
  • 首先在Build端双妨,通過(guò)IndexRangeScan_8(Build)算子淮阐,對(duì)于索引列user_id進(jìn)行了范圍掃描,所以該算子的對(duì)象是table:a0_,index:idx_user_id(user_id)刁品,意思為操作的對(duì)象是表a0_的索引idx_user_id(user_id)
  • 然后通過(guò)范圍掃描索引得到的rowId掃描表獲得數(shù)據(jù)泣特,所以TableRowIDScan_9(Probe)算子的操作對(duì)象是表a0_
operator info: 子任務(wù)執(zhí)行時(shí)候的一些算是操作日志的信息
這個(gè)很容易理解,基本是每一步的操作日志挑随,就不舉栗子說(shuō)明状您,從原來(lái)的栗子中都可以看的懂

TiDB執(zhí)行計(jì)劃中的算子就為大家說(shuō)到這里,歡迎大家來(lái)交流兜挨,指出文中一些說(shuō)錯(cuò)的地方膏孟,讓我加深認(rèn)識(shí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拌汇,一起剝皮案震驚了整個(gè)濱河市柒桑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪舀,老刑警劉巖魁淳,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異与倡,居然都是意外死亡界逛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門纺座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)息拜,“玉大人,你說(shuō)我怎么就攤上這事净响∩倨郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵别惦,是天一觀的道長(zhǎng)狈茉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掸掸,這世上最難降的妖魔是什么氯庆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮扰付,結(jié)果婚禮上堤撵,老公的妹妹穿的比我還像新娘。我一直安慰自己羽莺,他們只是感情好实昨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盐固,像睡著了一般荒给。 火紅的嫁衣襯著肌膚如雪丈挟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天志电,我揣著相機(jī)與錄音曙咽,去河邊找鬼。 笑死挑辆,一個(gè)胖子當(dāng)著我的面吹牛例朱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鱼蝉,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洒嗤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了魁亦?” 一聲冷哼從身側(cè)響起渔隶,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洁奈,沒(méi)想到半個(gè)月后派撕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睬魂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀赌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯哮。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖商佛,靈堂內(nèi)的尸體忽然破棺而出喉钢,到底是詐尸還是另有隱情,我是刑警寧澤良姆,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站玛追,受9級(jí)特大地震影響税课,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痊剖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一韩玩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陆馁,春花似錦找颓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佛析。三九已至,卻和暖如春彪蓬,著一層夾襖步出監(jiān)牢的瞬間寸莫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工寞焙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留储狭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓捣郊,卻偏偏與公主長(zhǎng)得像辽狈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呛牲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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