10gen工程師講數(shù)據(jù)庫索引實現(xiàn)
MongoDB盡管在數(shù)據(jù)存儲上與傳統(tǒng)關系數(shù)據(jù)庫很不一樣,但是在索引構建上卻幾乎是與傳統(tǒng)關系型數(shù)據(jù)庫一致。主要是使用了B-tree作為索引結構。
Indexes in MongoDB are conceptually similar to those in RDBMSes like MySQL. You will want an index in MongoDB in the same sort of situations where you would have wanted an index in MySQL.
下面一篇文章是10gen工程師 Kyle Banker 所寫,他拿食譜舉例,講解了在數(shù)據(jù)庫系統(tǒng)中索引的基本實現(xiàn),非常形像。本站簡單翻譯如下,更詳細的內(nèi)容,請直接查看原文:
原文鏈接:The Joy Of Indexing
1.唯一索引
想像你要在一本沒有目錄的食譜上查找某一道菜的做法,那么你唯一的辦法可能就是從頭到尾把這本幾百頁的書看一遍,直到找到你想找的菜。
而一個快速的方法就是給菜譜加上一個目錄,目錄中有每一道菜的名字與相應頁數(shù)的對應,并且菜名是按字母順序排列的如下,這樣你就可以按首字母快速地找到你要找的菜譜的頁數(shù)了。(這個基本上對應的是唯一索引的形式)
舉例:
水餃
- 45
水煮肉片
- 4,011
水煮魚
- 943
2.非唯一索引
但是如果我今天買了條魚,想查一下所有跟魚相關的做法,那么用上面的索引就沒辦法了。于是出現(xiàn)下面一種索引構建方法,即將所有菜的材料構建目錄,這時候一個材料對應多道菜。
舉例:
魚
- 3, 20, 42, 88, 103, 1,215…
豬肉
- 2, 47, 88, 89, 90, 275…
白菜
- 7, 9, 80, 81, 82, 83, 84…
3.聯(lián)合索引
下面還有另一種需求,如果我知道材料里有魚,而我又知道這道菜的名字,就不用查找到材料后去翻看后面幾個具體頁的菜再來選擇了。滿足這種需求的是聯(lián)合索引:
魚
- 水煮魚
—- 1,215
- 紅燒帶魚
—- 88
- 酸菜魚
—- 103
豬肉
- 紅燒肉
—- 875
- 小炒肉
—- 89
- 回鍋肉
—- 47
白菜
- 白菜湯
—- 2,000
- 素炒白菜
—- 2,133
- 白菜燉豆腐
—- 1,050
|