mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程


mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
| 总结/Edison Zhou
前面我们学习了如何套用常见的设计模式打造合适的模型设计,本篇我们来看看在MongoDB中如何使用索引来提高查询效率 。
1 MongoDB也有索引?
在使用传统关系型数据库如MSSQL、MySQL等的时候,我们经常会为table中需要经常查询的字段建立index(索引) 。那么,MongoDB作为NoSQL的代表,是否也有索引呢?
答案是:有的 。
-- 查看集合的所有已有索引db.collectionName.getIndexes()MongoDB的两种扫描方式
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时会和MySQL一样必须扫描集合中的每个文档并选取那些符合查询条件的记录 。
mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
在MongoDB中,全集合扫描被称之为 COLLSCAN,而索引扫描则被称之为IXSCAN 。我们可以在MongoDB中使用类似于MySQL中的explain来查看执行计划,判断该查询是否是IXSCAN即索引扫描:
db.userinfos.find({name:"张三"}).explain()
mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
和关系型数据库一样,扫描全集合的查询COLLSCAN的效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的 。
MongoDB索引的数据结构:B树
我们都知道MySQL InnoDB引擎的索引采用的是B+树,那么MongoDB的索引采用的是什么数据结构呢?
答案是:B树 。
为什么MySQL采用B+树,而MongoDB采用B树呢?
首先,我们需要知道,什么是B树,什么又是B+树 。
(1)B+树(MySQL等关系型数据库广泛采用)
mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
B+树的两个明显特点
数据只出现在叶子节点(查询效率高)所有叶子节点增加了一个链指针(便于范围查询)(2)B树(MongoDB采用)
mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
B树的两个明显特点
树内的每个节点都存储数据叶子节点之间无指针相邻针对上面的B+树和B树的特点,我们可以得到以下两个结论:(1) B树的树内存储数据,因此查询单条数据的时候,B树的查询效率不固定,最好的情况是O(1) 。我们可以认为在做单一数据查询的时候,使用B树平均性能更好 。但是,由于B树中各节点之间没有指针相邻,因此B树不适合做一些数据遍历操作 。
(2) B+树的数据只出现在叶子节点上,因此在查询单条数据的时候,查询速度非常稳定 。因此,在做单一数据的查询上,其平均性能并不如B树 。但是,B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询 。
综述,基于关系型数据库的关系模型 和 文档数据库的文档模型,我们可以知道:MySQL中数据遍历操作比较多(因为需要多表关联和范围查找),所以用B+树作为索引结构 。而MongoDB是做单一文档查询比较多(因为内嵌设计不需要多集合关联且很少范围查找),数据遍历操作比较少,所以用B树作为索引结构 。
MongoDB的索引查询效率
由于B树/B+树的工作过程十分复杂,但本质上,它是一个有序的数据结构 。
我们可以用一个数组来理解它,假设这里有一个索引为{a:1}(a升序):
mongodb是nosql数据库吗 9 NoSQL | MongoDB入门实战教程

文章插图
在一个有序的结构上,基于我们学习过的二分查找法,可以实现一个O(log2(n))的高效搜索效率 。这也可以解释,为什么基于索引查询,在数据量很大的情况下会快很多 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: