left join的優(yōu)化,小的結(jié)果集驅(qū)動(dòng)大的結(jié)果集

為何小表驅(qū)動(dòng)大表箱亿?

數(shù)據(jù)庫(kù)最傷神的是數(shù)據(jù)庫(kù)連接曹傀。

1.建立2次連接产场,每次進(jìn)行上百萬(wàn)的數(shù)據(jù)集的查詢

2.上百萬(wàn)次的連接每庆,每次進(jìn)行2個(gè)數(shù)據(jù)集的查詢

left join 的時(shí)間開(kāi)銷類似于笛卡爾積痢士,相當(dāng)費(fèi)時(shí),如果關(guān)聯(lián)字段是索引字段鳞贷,可以減少時(shí)間復(fù)雜度履植,但是還是非常費(fèi)時(shí)。

left 的優(yōu)化:首先悄晃,mysql都是使用(Nested Loop )循環(huán)套嵌的方式實(shí)現(xiàn)join,這里包括兩個(gè)部分:驅(qū)動(dòng)表結(jié)果集作為條件連接被驅(qū)動(dòng)表X凿滤,被驅(qū)動(dòng)表根據(jù)驅(qū)動(dòng)表結(jié)果查詢數(shù)據(jù)集Y妈橄。時(shí)間復(fù)雜度(X*Y),這里的第二部分是數(shù)據(jù)庫(kù)內(nèi)部的操作翁脆,涉及io眷蚓,cpu等的操作很少,而且可以使用索引優(yōu)化反番。第一部分是表的連接沙热,這里是需要時(shí)間的,時(shí)間復(fù)雜度罢缸,CPU篙贸,io操作等都耗費(fèi)比內(nèi)部操作更多的時(shí)間。所以枫疆,以少的實(shí)際結(jié)果集(where篩選后)驅(qū)動(dòng)大的結(jié)果集爵川,大的結(jié)果集使用索引,這種方式能夠最大層度的減少時(shí)間復(fù)雜度息楔。也就是永遠(yuǎn)使用小的結(jié)果集驅(qū)動(dòng)大的結(jié)果集寝贡。

這里規(guī)定join連接單次總用時(shí)為m1,被驅(qū)動(dòng)表一次查詢使用時(shí)間為m2;則總的查詢時(shí)間為:

X*m1+Y*m2;這里的m1大于m2則 X相對(duì)于Y越小值依,結(jié)果越小;

B平衡樹的索引結(jié)構(gòu)圃泡,三種索引的速度以及覆蓋范圍排序: 1覆蓋索引>= 2聚集索引>3非聚集索引。 1和2中大于的部分不是速度愿险,而是適用范圍颇蜡,1覆蓋索引能夠根據(jù)業(yè)務(wù)自定義,而2基本都是主鍵,適用性不強(qiáng)澡匪,但是覆蓋索引占用內(nèi)存比較大熔任,這個(gè)是一個(gè)限制條件。

索引總共分為三種唁情,聚集索引疑苔,非聚集索引,覆蓋索引

非聚集索引會(huì)先找到聚集索引的唯一主鍵甸鸟,然后根據(jù)聚集索引查找值惦费,例外的是覆蓋索引(多列索引):查詢列在索引列中,不需要再到聚集索引中查找一遍抢韭。

沒(méi)有主鍵(聚集索引)的表加數(shù)據(jù)堆薪贫,數(shù)據(jù)堆是通過(guò)使用索引分配圖(IAM)頁(yè)來(lái)維護(hù)的。當(dāng)在數(shù)據(jù)堆上創(chuàng)建了非聚簇索引時(shí)刻恭,葉級(jí)中包含了指向數(shù)據(jù)頁(yè)的行標(biāo)識(shí)符瞧省。行標(biāo)識(shí)符指定記錄行的邏輯順序,由文件ID鳍贾、頁(yè)號(hào)和行ID組成


nested join

嵌套循環(huán)連接將驅(qū)動(dòng)表(外表)和被驅(qū)動(dòng)表(內(nèi)表)進(jìn)行join鞍匾,讀取外表的每一行,和內(nèi)表進(jìn)行比較操作骑科,數(shù)據(jù)庫(kù)一般將建有索引的表作為內(nèi)表橡淑。

通過(guò)偽代碼可以看到,執(zhí)行主要分三步:

選定驅(qū)動(dòng)表

選定另一張表為內(nèi)表

將驅(qū)動(dòng)表中每一行和內(nèi)表中的記錄逐一進(jìn)行匹配

hive

hive存儲(chǔ)基于hdfs咆爽,計(jì)算主要是基于mapreduce框架梁棠。

連接類型

map side join

如果join中有一張表較小,這種情況下斗埂,可以使用map join符糊,不需要進(jìn)行reduce操作。

select?/*+ mapjoin(b) */

a.key

, a.value

from?a

join?b

on?a.key?= b.key

如果join的表在join列上進(jìn)行了分桶蜜笤,一張表的桶數(shù)是其它表的倍數(shù)濒蒋,這種情況下,相關(guān)桶之間在map端進(jìn)行join操作把兔,稱為bucketized map-side join,通過(guò)如下參數(shù)開(kāi)啟

? -- 方法一

? set hive.optimize.bucketmapjoin = true;

map join執(zhí)行步驟:

本地工作:在本地機(jī)器讀入數(shù)據(jù)沪伙,在內(nèi)存中建立hash表,然后寫入本地磁盤并上傳至hdfs县好。最后將hash表寫入分布式緩存中

map任務(wù):將數(shù)據(jù)從分布式緩存中讀入內(nèi)存围橡,將表中數(shù)據(jù)逐一和hash表匹配。將匹配到數(shù)據(jù)進(jìn)行合并并寫入hdfs中

無(wú)reduce任務(wù)

common join(reduce side join)

若兩種表都較大在map端無(wú)法緩存進(jìn)內(nèi)存缕贡,此時(shí)只能在reduce端進(jìn)行join

如果多張表中用同一列進(jìn)行join操作翁授,那么hive會(huì)將其轉(zhuǎn)成一個(gè)map/redcuce job

謂詞下推(Predicate Pushdown)

原理

對(duì)于left join拣播,先給出如下定義:

保留行表:outer join中返回所有行的表,如left outer join中的左表收擦,right outer join中的右表

空供應(yīng)表:如果和主表沒(méi)有匹配上返回空值的表贮配,如left outer join中的左表,right outer join中左表

join過(guò)程中謂詞:寫在join過(guò)程中的過(guò)濾條件

join后謂詞:寫在where條件中的過(guò)濾條件

存在如下反向規(guī)則:

Join過(guò)程中謂詞不能推移到保留行表

join后謂詞不能推移到空供應(yīng)表

正向解釋下:join過(guò)程中的過(guò)濾條件可以推移到空供應(yīng)表上塞赂,where 過(guò)程中的條件可以推移到保留行表泪勒。

=

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宴猾,隨后出現(xiàn)的幾起案子圆存,更是在濱河造成了極大的恐慌,老刑警劉巖仇哆,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沦辙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡讹剔,警方通過(guò)查閱死者的電腦和手機(jī)油讯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)延欠,“玉大人撞羽,你說(shuō)我怎么就攤上這事∩蓝常” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵谒出,是天一觀的道長(zhǎng)隅俘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笤喳,這世上最難降的妖魔是什么为居? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮杀狡,結(jié)果婚禮上蒙畴,老公的妹妹穿的比我還像新娘。我一直安慰自己呜象,他們只是感情好膳凝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恭陡,像睡著了一般蹬音。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上休玩,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天著淆,我揣著相機(jī)與錄音劫狠,去河邊找鬼。 笑死永部,一個(gè)胖子當(dāng)著我的面吹牛独泞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苔埋,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼懦砂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了讲坎?” 一聲冷哼從身側(cè)響起孕惜,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晨炕,沒(méi)想到半個(gè)月后衫画,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓮栗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年削罩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片费奸。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弥激,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愿阐,到底是詐尸還是另有隱情微服,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布缨历,位于F島的核電站以蕴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辛孵。R本人自食惡果不足惜丛肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魄缚。 院中可真熱鬧宝与,春花似錦、人聲如沸冶匹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嚼隘。三九已至榜聂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗓蘑,已是汗流浹背须肆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工匿乃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豌汇。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓幢炸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拒贱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宛徊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • MySQL技術(shù)內(nèi)幕:SQL編程 姜承堯 第1章 SQL編程 >> B是由MySQL創(chuàng)始人之一Monty分支的一個(gè)版...
    沉默劍士閱讀 2,412評(píng)論 0 3
  • --- layout: post title: "如果有人問(wèn)你關(guān)系型數(shù)據(jù)庫(kù)的原理,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 780評(píng)論 0 3
  • 不眠夜終于過(guò)去了逻澳,最高體溫居然達(dá)到了39.9闸天,每小時(shí)不定量的喝補(bǔ)液鹽,用小勺喂斜做,不要一次太多苞氮,半勺半勺給,一晚上用...
    lily愛(ài)生活閱讀 117評(píng)論 0 0
  • 禾葡蘭護(hù)膚中心由專業(yè)皮膚科醫(yī)師團(tuán)隊(duì)參與產(chǎn)品設(shè)計(jì)與研發(fā)贷帮,早在2015年就成功引入了素有美容奧運(yùn)會(huì)之稱的“圣迪斯哥國(guó)際...
    士大夫的傲嬌閱讀 244評(píng)論 0 0
  • 吃了一大碗,小時(shí)候常吃的诱告,不開(kāi)心時(shí)吃得多撵枢,過(guò)去化了妝,她領(lǐng)我看書精居,為我念書诲侮。 她抱著我,溫暖的懷抱...
    Lan_9e0f閱讀 48評(píng)論 0 1