分享好友 数据库首页 频道列表

Mongodb索引的优化

MongoDB  2016-04-27 15:590

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB索引几乎和关系型数据库的索引一样.MongoDB的查询优化器能够使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序.准确来说,这些索引是通过B-Tree索引来实现的。在命令行中,可以通过调用ensureIndex()函数来建立索引,该函数指定一个到多个需要索引的字段,下面介绍mongodb索引如何优化

一、索引简介

例如如下数据

db.refactor.insert({"username":"refactor","age":24,"isactive":true})
db.refactor.insert({"username":"refactor","age":30,"isactive":false})
db.refactor.insert({"username":"aaaaa","age":24,"isactive":false})
db.refactor.insert({"username":"aaaaa","age":34,"isactive":true})
db.refactor.insert({"username":"sssssss","age":24,"isactive":true})
db.refactor.insert({"username":"tttttt","age":24,"isactive":true})
db.refactor.insert({"username":"tttttt","age":54,"isactive":true})
db.refactor.insert({"username":"bbbbb","age":24,"isactive":false})
db.refactor.insert({"username":"rrrrr","age":24,"isactive":true})
db.refactor.insert({"username":"rrrrr","age":54,"isactive":false})

要按照username键进行查找,就可以在此键上建立索引,来提高查询速度.

db.refactor.ensureIndex({"username":1})

要按照username,age键进行查找,就可以在此键上建立索引,来提高查询速度.

db.refactor.ensureIndex({"age":1,"username":1})

传递给ensureIndex的文档是一组值为1或-1的键,1为升序,-1为降序,表示索引的创建方向.若索引只有一个键,则方向无关紧要.

若是有多个键,就得考虑索引的方向问题了.

二、mongodb自带的就有监控,根据这些监控信息,可以做为优化的依据

1、explain执行计划

MongoDB提供了一个explain命令让我们获知系统如何处理查询请求。利用explain命令,我们可以很好地观察系统如何使用索引来加快检索同时可以针对性优化索引。

几个关键的字段说明

cursor:返回游标类型(BasicCursor或BtreeCursor)
nscanned:被扫描的文档数量
n:返回的文档数量
millis:耗时(毫秒)
indexBounds:所使用的索引

例如

SQL 代码

>db.order.ensureIndex({"user.uid":1})

>db.order.find({ "status": 1.0, "user.uid": { $gt: 2663199.0 } }).explain() 
{ 
"cursor" : "BtreeCursor user.uid_1", 
"nscanned" : 337800, 
"nscannedObjects" : 337800, 
"n" : 337800, 
"millis" : 1371, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
"user.uid" : [ 
[ 
2663199, 
1.7976931348623157e+308 
] 
] 
} 
}

2、优化器profile

在MySQL中慢查询日志是经常作为我们优化数据库的依据那在MongoDB中是否有类似的功能呢答案是肯定的那就是MongoDBDatabaseProfiler。所以MongoDB不仅有而且还有一些比MySQL的SlowQueryLog更详细的信息。
mongodb把要输出的慢语句,存在于db.system.profile。与mysql的slowlog配置相似,需要进行参数设置,mongo才会输出慢语句到profile。有两个参数来控制profile的输出
db.setProfilingLevel(level,slowms);

默认为0 不输出 1按第二个参数时间阀值(单位为毫秒)输出 2全部输出。通常我们在调优的时候都在测试环境打开参数。在生产环境下一般不输出profile。

比如

> db.system.profile.find({millis:{$gt:1000}})

就可以输出,查询时间大于1秒的慢语句。

profile输出的各项值的含义是

ts:命令执行时间
info:命令的内容
query:代表查询
order.order: 代表查询的库与集合
reslen:返回的结果集大小,byte数
nscanned:扫描记录数量
nquery:后面是查询条件
nreturned:返回记录数及用时
millis:所花时间

如果发现时间比较长,那么就需要作优化。

比如

(1)、nscanned数很大,或者接近记录总数,那么可能没有用到索引查询。

(2)、reslen很大,有可能返回没必要的字段。

(3)、nreturned很大,那么有可能查询的时候没有加限制。

三、MongoDB的索引选择机制

MongoDB的优化程序会在对比中选择更优秀的索引。

首先,它会给查询做一个初步的“最佳索引”;

其次,假如这个最佳索引不存在它会做尝试来选出表现最好的索引;

最后,优化器还会记住所有类似查询的选择(只到大规模文件变动或者索引上的变动)。

那么优化器是如何定义查询的“最佳索引”。最佳索引必须包含查询中所有可以做过滤及需要排序的字段。此外任何用于范围扫描的字段以及排序字段都必须排在做等值查询的字段之后。如果存在不同的最佳索引,那么Mongo将随机选择。

四、MongoDB的索引总结

1. 等值测试

索引中加入所有需要做等值测试的字段,任意顺序。

2. 排序字段(多排序字段的升/降序问题 )

根据查询的顺序有序的向索引中添加字段。

3. 范围过滤

以字段的基数(Collection中字段的不同值的数量)从低到高的向索引中添加范围过滤字段。

4、如果索引中的等值或者范围查询字段不能过滤出Collection中90%以上的文档,那么把它移除索引估计会更好一些。

5、索引使得可以通过关键字段获取数据,能够使得快速查询和更新数据。但是,必须注意的是,索引也会在插入和删除的时候增加一些系统的负担。往集合中插入数据的时候,索引的字段必须加入到B-Tree中去,因此,索引适合建立在读远多于写的数据集上,对于写入频繁的集合,在某些情况下,索引反而有副作用。不过大多数集合都是读频繁的集合,所以集合在大多数情况下是有用的。

6、如果数据集合比较小(通常小于4M),使用sort()而不需要建立索引就能够返回数据。在这种情况下,做好联合使用limit()和sort()。

关于Mongodb索引的优化就给大家介绍这么多,希望对大家有所帮助!

查看更多关于【MongoDB】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
MongoDB快速入门笔记(二)之MongoDB的概念及简单操作
MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列、行,mongoDB数据库则是由一系列的文档组成。接下来通过本文给大家介绍MongoDB的概念及简单操作,一起看看吧

0评论2016-06-20133

windows下mongodb安装与使用图文教程(整理)
这篇文章主要介绍了windows下mongodb安装与使用图文教程(整理)的相关资料,需要的朋友可以参考下

0评论2016-06-20156

Mongodb中MapReduce实现数据聚合方法详解
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧

0评论2016-06-20180

Mongodb聚合函数count、distinct、group如何实现数据聚合操作
Mongodb中自带的基本聚合函数有三种:count、distinct和group。下面我们分别来讲述一下这三个基本聚合函数及如何实现数据聚合操作,感兴趣的朋友一起学习吧

0评论2016-06-20213

MongoDB快速入门笔记(六)之MongoDB的文档修改操作
这篇文章主要介绍了MongoDB快速入门笔记(六)之MongoDB的文档修改操作的相关资料,需要的朋友可以参考下

0评论2016-06-20195

MongoDB快速翻页的方法
这篇文章主要为大家详细介绍了MongoDB快速翻页的方法,通过实例学习在MongoDB中翻阅数据的不同方式,感兴趣的小伙伴们可以参考一下

0评论2016-06-20219

MongoDB快速入门笔记(一)之windows下安装MongoDB方法
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。本文重点给大家介绍MongoDB快速入门笔记(一)之windows下安装MongoDB方法,非常不错具有参考借鉴价值,感兴趣的朋友一起看下吧

0评论2016-06-20175

MongoDB快速入门笔记(六)之MongoDB删除文档操作
这篇文章主要介绍了MongoDB快速入门笔记(六)之MongoDB删除文档操作 的相关资料,需要的朋友可以参考下

0评论2016-06-20119

Windows或Linux系统中备份和恢复MongoDB数据的教程
不得不说MongoDB的备份回复操作对比其他数据库来说真的算得上是简便的,无论是在Windows的命令行中或者是Linux里的脚本执行,这里我们就来看一下Windows或Linux系统中备份和恢复MongoDB数据的教程

0评论2016-06-20192

MongoDB快速入门笔记(七)MongoDB的用户管理操作
这篇文章主要介绍了MongoDB快速入门笔记(七)MongoDB的用户管理操作 的相关资料,需要的朋友可以参考下

0评论2016-06-20193

MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码
MongoDB 是一个基于分布式文件存储的数据库。接下来通过本文给大家介绍MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码,感兴趣的朋友一起学习吧

0评论2016-06-20120

MongoDB快速入门笔记(三)之MongoDB插入文档操作
这篇文章主要介绍了MongoDB快速入门笔记(三)之MongoDB插入文档操作 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

0评论2016-06-20120

MongoDB 学习笔记(一)-MongoDB配置
MongoDB 是一个基于分布式文件存储的数据库。接下来通过本文给大家介绍MongoDB 学习笔记(一)MongoDB配置的相关资料,需要的朋友可以参考下

0评论2016-06-20173

MongoDB查询性能优化验证及验证
这篇文章主要介绍了MongoDB查询性能验证及优化的相关知识,涉及到MongoDB 查询优化原则知识点,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧

0评论2016-04-27207

MongoDB实现基于关键词的文章检索功能(C#版)
这篇文章主要介绍了MongoDB实现基于关键词的文章检索功能(C#版)的相关资料,需要的朋友可以参考下

0评论2016-04-2791

MongoDB单表数据的导出和恢复实例讲解
MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便。 MongoDB 工作在收集和文件的概念。接下来通过本文给大家介绍MongoDB单表数据的导出和恢复实例讲解,对mongodb导出和恢复数据知识感兴趣的朋友一起学习吧

0评论2016-04-27196

MongoDB中的主从同步配置和mongod相关启动命令讲解
这篇文章主要介绍了MongoDB中的主从同步配置和mongod相关启动命令讲解,文中也罗列了很多其他常用的mongod命令参数,需要的朋友可以参考下

0评论2016-04-27166

JavaScript按日期查询MongoDB中的数据的要点示例
这篇文章主要介绍了JavaScript按日期查询MongoDB中数据的要点示例,MongoDB所支持的BSON有JSON没有的一些数据类型,如Date和BinData类型,需要的朋友可以参考下

0评论2016-04-27136

MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下

0评论2016-04-27364

MongoDB分片测试
分片是mongoDB扩展的一种方式。分片分割一个collection并将不同的部分存储在不同的机器上,本文给大家介绍MongoDB分片测试,需要的朋友参考下吧

0评论2016-04-27137

更多推荐