為什么Mongodb索引用B樹猜绣,而Mysql用B+樹?

這里的Mysql指的是Innodb的存儲引擎下的索引結構螟深,其他存儲引擎我們暫時不討論。

B樹和B+樹

開頭蜗顽,我們先回憶一下布卡,B樹和B+樹的結構以及特點,如下所示:B樹

樹內(nèi)的每個節(jié)點都存儲數(shù)據(jù)

葉子節(jié)點之間無指針相鄰

B+樹

注意一下B+樹的兩個明顯特點

數(shù)據(jù)只出現(xiàn)在葉子節(jié)點

所有葉子節(jié)點增加了一個鏈指針

針對上面的B+樹和B樹的特點雇盖,我們做一個總結(1)B樹的樹內(nèi)存儲數(shù)據(jù)忿等,因此查詢單條數(shù)據(jù)的時候,B樹的查詢效率不固定崔挖,最好的情況是O(1)贸街。我們可以認為在做單一數(shù)據(jù)查詢的時候,使用B樹平均性能更好狸相。但是薛匪,由于B樹中各節(jié)點之間沒有指針相鄰,因此B樹不適合做一些數(shù)據(jù)遍歷操作脓鹃。

(2)B+樹的數(shù)據(jù)只出現(xiàn)在葉子節(jié)點上逸尖,因此在查詢單條數(shù)據(jù)的時候,查詢速度非常穩(wěn)定瘸右。因此娇跟,在做單一數(shù)據(jù)的查詢上,其平均性能并不如B樹太颤。但是苞俘,B+樹的葉子節(jié)點上有指針進行相連,因此在做數(shù)據(jù)遍歷的時候龄章,只需要對葉子節(jié)點進行遍歷即可吃谣,這個特性使得B+樹非常適合做范圍查詢。

因此做裙,我們可以做一個推論:沒準是Mysql中數(shù)據(jù)遍歷操作比較多岗憋,所以用B+樹作為索引結構。而Mongodb是做單一查詢比較多锚贱,數(shù)據(jù)遍歷操作比較少澜驮,所以用B樹作為索引結構。

那么為什么Mysql做數(shù)據(jù)遍歷操作多惋鸥?而Mongodb做數(shù)據(jù)遍歷操作少呢杂穷?因為Mysql是關系型數(shù)據(jù)庫悍缠,而Mongodb是非關系型數(shù)據(jù)。

那為什么關系型數(shù)據(jù)庫耐量,做數(shù)據(jù)遍歷操作多飞蚓?

而非關系型數(shù)據(jù)庫,做數(shù)據(jù)遍歷操作少呢廊蜒?我們繼續(xù)往下看

關系型VS非關系型

假設趴拧,我們此時有兩個邏輯實體:學生(Student)和班級(Class),這兩個邏輯實體之間是一對多的關系山叮。畢竟一個班級有多個學生著榴,一個學生只能屬于一個班級。關系型數(shù)據(jù)庫我們在關系型數(shù)據(jù)庫中屁倔,考慮的是用幾張表來表示這二者之間的實體關系脑又。常見的無外乎是,一對一關系锐借,用一張表就行问麸。一對多關系,用兩張表钞翔。多對多關系严卖,用三張表。那這里布轿,我們需要用兩張表表示二者之間邏輯關系哮笆,如下所示


cname

1班

cname

SELECT *

FROM t_student t1, (

? ? ?? SELECT cid

? ? ?? FROM t_class

? ? ?? WHERE cname = '1班'

?? ) t2

WHERE t1.cid = t2.cid

而這,就涉及到了數(shù)據(jù)遍歷操作汰扭!

因為但凡做這種關聯(lián)查詢疟呐,你躲不開join操作的!既然涉及到了join操作东且,無外乎從一個表中取一個數(shù)據(jù),去另一個表中逐行匹配本讥,如果索引結構是B+樹珊泳,葉子節(jié)點上是有指針的,能夠極大的提高這種一行一行的匹配速度拷沸!

有的人或許會抬杠說色查,如果我先執(zhí)行

SELECT cid

FROM t_class

WHERE cname = '1班'

獲得cid后,再去循環(huán)執(zhí)行

SELECT *

FROM t_student

WHERE cid = ...

就可以避開join操作呀撞芍?

對此秧了,我想說。你確實避開了join操作序无,但是你數(shù)據(jù)遍歷操作還是沒避開验毡。你還是需要在student的這張表的葉子節(jié)點上衡创,一遍又一遍的遍歷!

那在非關系型數(shù)據(jù)庫中晶通,我們?nèi)绾尾樵僣name為1班的班級璃氢,有多少學生?非關系型數(shù)據(jù)庫有人說狮辽,你可以這么設計一也?也就是弄兩個集合如下所示


確實,這么設計是可以的喉脖,我沒說不行椰苟。只是不符合非關系型數(shù)據(jù)庫的設計初衷。在MongoDB中树叽,根本不推薦這么設計舆蝴。雖然,Mongodb中有一個操作菱皆,可以做查詢须误。但是理想情況下,這個lookup操作應該不會經(jīng)常使用仇轻,如果你需要經(jīng)常使用它京痢,那么你就使用了錯誤的數(shù)據(jù)存儲了(數(shù)據(jù)庫):如果你有相關聯(lián)的數(shù)據(jù),應該使用關系型數(shù)據(jù)庫(SQL)篷店。

因此祭椰,正規(guī)的設計應該如下


name

db.class.find( { name: '1班' } )

這樣就能查詢出自己想要的結果。

而這疲陕,就是一種單一數(shù)據(jù)查詢!畢竟你不需要去逐行匹配方淤,不涉及遍歷操作,幸運的情況下,有可能一次IO就能夠得到你想要的結果蹄殃。

因此携茂,由于關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)的設計方式上的不同。導致在關系型數(shù)據(jù)中诅岩,遍歷操作比較常見讳苦,因此采用B+樹作為索引,比較合適吩谦。而在非關系型數(shù)據(jù)庫中鸳谜,單一查詢比較常見,因此采用B樹作為索引式廷,比較合適咐扭。

面試套路

目前套路有如下幾種

套路一

你簡歷寫了mysql,沒寫mongodb!面試官:"說說mysql索引結構?"我:"巴拉巴拉"面試官:"知道為什么用B+樹蝗肪,不用B樹么袜爪?"這個時候正常的面試者就蒙了,會把B樹的缺點噴一通穗慕!于是乎下一問就是面試官:"其實一些非關系型數(shù)據(jù)庫饿敲,如mongodb用的就是B樹,你知道原因么逛绵?"然后你就回去等通知了怀各!

套路二

你簡歷寫了mysql,也寫了mongodb!這種情況更完美术浪!面試官:"說說mysql索引結構瓢对?"我:"巴拉巴拉"面試官:"你簡歷寫了Mongodb,有了解過他的索引結構么胰苏?"我:"巴拉巴拉"面試官:"為什么Mongodb索引用B樹硕蛹,而Mysql用B+樹?"然后你就回去等通知了硕并!

套路三

你簡歷既沒寫mysql法焰,沒寫mongodb!面試官;"如果你來設計數(shù)據(jù)庫倔毙,你會對他的索引用什么數(shù)據(jù)結構埃仪?"我:"首先不考慮紅黑樹這類,巴拉巴拉…應該會用B樹或者B+樹陕赃。"面試官卵蛉;“如果我要設計一個像Mongodb那樣的非關系型數(shù)據(jù)庫,我要用什么數(shù)據(jù)結構當索引比較合適?”然后你就可以回去等通知了么库!

上面三個套路都是真實存在的傻丝!總之,只要面試官想問這個問題诉儒,都可以繞到這個問題上去葡缰!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忱反,隨后出現(xiàn)的幾起案子泛释,更是在濱河造成了極大的恐慌,老刑警劉巖缭受,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異该互,居然都是意外死亡米者,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔓搞,“玉大人胰丁,你說我怎么就攤上這事∥狗郑” “怎么了锦庸?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒲祈。 經(jīng)常有香客問我甘萧,道長,這世上最難降的妖魔是什么梆掸? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任扬卷,我火速辦了婚禮,結果婚禮上酸钦,老公的妹妹穿的比我還像新娘怪得。我一直安慰自己,他們只是感情好卑硫,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布徒恋。 她就那樣靜靜地躺著,像睡著了一般欢伏。 火紅的嫁衣襯著肌膚如雪入挣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天颜懊,我揣著相機與錄音财岔,去河邊找鬼。 笑死河爹,一個胖子當著我的面吹牛匠璧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咸这,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼夷恍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了媳维?” 一聲冷哼從身側響起酿雪,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侄刽,沒想到半個月后指黎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡州丹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年醋安,在試婚紗的時候發(fā)現(xiàn)自己被綠了杂彭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡吓揪,死狀恐怖亲怠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠辞,我是刑警寧澤团秽,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站叭首,受9級特大地震影響习勤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜放棒,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一姻报、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧间螟,春花似錦吴旋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摩泪,卻和暖如春笆焰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背见坑。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工嚷掠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荞驴。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓不皆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熊楼。 傳聞我的和親對象是個殘疾皇子霹娄,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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