MongoDB索引使用B-tree数据结构。
索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来限制它必须检查的文档数。
扩展资料
MongoDB索引的类型
1、单字段索引(Single Field Index)
这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个单独的索引就是此种类型。
2、复合索引(Compound Index)
索引field的先后顺序很关键,影响有两方面:
(1)MongoDB在复合索引中是根据prefix排序查询,就是说排在前面的可以单独使用。
(2)过滤出的document越少的field越应该放在前面,比如此例中id如果是唯一的,那么就应该放在最前面,因为这样通过id就可以锁定唯一一个文档。而如果通过city或者score过滤完成后还是会有大量文档,这就会影响最终的性能。
索引的排序顺序不同:复合索引最末尾的field,其排序顺序不同对于MongoDB的查询排序 *** 作是有影响的。
3、多key索引(Multikey Index):主要针对数据类型为数组的类型。
4、其它类型索引:另外,MongoDB中还有其它如哈希索引,地理位置索引以及文本索引,主要用于一些特定场景。
WiredTiger引擎被MongoDB收购,WiredTiger数据结构不是b-tree,不是b-tree,不是b-tree。WiredTiger数据结构官方说明
简单截图作为证明。
rootpage、internal page和leaf page,前两者包含指向其子页的page index指针,不包含集合中的真正数据,leaf page包含集合中的真正数据。leaf page包含一个页头(page header)、块头(block header)和真正的数据(key/value),其中页头定义了页的类型、页中实际载荷数据的大小、页中记录条数等信息;块头定义了此页的checksum、块在磁盘上的寻址位置等信息。
WiredTiger有一个block manage模块,用来为page分配block。如果要定位某一行数据(key/value)的位置,可以先通过block的位置找到此page(相对于文件起始位置的偏移量),再通过page找到行数据的相对位置,最后可以得到行数据相对于文件起始位置的偏移量offsets。
mongodb和mysql索引数据结构也是采用b+tree,但是叶子节点存储的是数据主键id,这也是为什么mongodb和mysql必须要有主键的原因,而PostgreSQL索引数据结构也是采用b+tree,但叶子节点存储的是数据偏移量,这也是PostgreSQL无需主键的原因.
推荐两篇文章: wiredtiger作者文章预写日志第一篇
wiredtiger作者文章预写日志第二篇
答案:A1.文档型数据库
作为最受欢迎的NoSQL产品,文档型数据库MongoDB当仁不让地占据了第一的位置,同时它也是所有NoSQL数据库中排名最靠前的产品(总排行榜第七名)。Apache基金会的CouchDB排在第二,基于.Net的数据库RavenDB排在第三,Couchbase排在第四。
2.键值(Key-value)数据库
键值(Key-value)数据库是NoSQL领域中应用范围最广的,也是涉及产品最多的一种模型。从最简单的BerkeleyDB到功能丰富的分布式数据库Riak再到Amazon托管的DynamoDB不一而足。
在键值数据库流行度排行中,Redis不出意外地排名第一,它是一款由Vmware支持的内存数据库,总体排名第十一。排在第二位的是Memcached,它在缓存系统中应用十分广泛。排在之后的是Riak、BerkeleyDB、SimpleDB、DynamoDB以及甲骨文的Oracle NoSQL数据库。值得注意的是,Oracle NoSQL数据库上榜不久,得分已经翻番,上升势头非常迅猛。
3. 列式存储
列式存储被视为NoSQL数据库中非常重要的一种模式,其中Cassandra流行度最高,它已经由Facebook转交给到Apache进行管理,同时Cassandra在全体数据库排名中排在第十位,紧随MongoDB成为第二受欢迎的NoSQL数据库。基于Hadoop的Hbase排在第二位,Hypertable排在第三。而Google的BigTable并未列入排名,原因是它并未正式公开。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)