10gen工程师讲数据库索引实现

MongoDB尽管在数据存储上与传统关系数据库很不一样,但是在索引构建上却几乎是与传统关系型数据库一致。主要是使用了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 所写,他拿食谱举例,讲解了在数据库系统中索引的基本实现,非常形像。本站简单翻译如下,更详细的内容,请直接查看原文:

原文链接:The Joy Of Indexing

1.唯一索引

想像你要在一本没有目录的食谱上查找某一道菜的做法,那么你唯一的办法可能就是从头到尾把这本几百页的书看一遍,直到找到你想找的菜。

而一个快速的方法就是给菜谱加上一个目录,目录中有每一道菜的名字与相应页数的对应,并且菜名是按字母顺序排列的如下,这样你就可以按首字母快速地找到你要找的菜谱的页数了。(这个基本上对应的是唯一索引的形式)

举例:

水饺
- 45
水煮肉片
- 4,011
水煮鱼
- 943

2.非唯一索引

但是如果我今天买了条鱼,想查一下所有跟鱼相关的做法,那么用上面的索引就没办法了。于是出现下面一种索引构建方法,即将所有菜的材料构建目录,这时候一个材料对应多道菜。

举例:


- 3, 20, 42, 88, 103, 1,215…
猪肉
- 2, 47, 88, 89, 90, 275…
白菜
- 7, 9, 80, 81, 82, 83, 84…

3.联合索引

下面还有另一种需求,如果我知道材料里有鱼,而我又知道这道菜的名字,就不用查找到材料后去翻看后面几个具体页的菜再来选择了。满足这种需求的是联合索引:


- 水煮鱼
—- 1,215
- 红烧带鱼
—- 88
- 酸菜鱼
—- 103
猪肉
- 红烧肉
—- 875
- 小炒肉
—- 89
- 回锅肉
—- 47
白菜
- 白菜汤
—- 2,000
- 素炒白菜
—- 2,133
- 白菜炖豆腐
—- 1,050

anyShare一切看了好文章不转的行为,都是耍流氓!
          

无觅相关文章插件,快速提升流量