如何优化Mongodb索引,具体方法是什么?
Admin 2022-11-21 群英技术资讯 683 次浏览
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()。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的关于MySQL和MariaDB的区别,主要介绍mariadb和mysql的性能的不同,感兴趣的朋友可以看看,下面我们一起来了解一下。
我们在使用MongoDB的时候我们都知道一般情况下用户信息都在存放在system.users表中,但是有很多小伙伴们不知道mongodb如何修改用户密码,那么下面我们就一起去看看吧。
索引是数据库中很重要的内容,对此,这篇文章就给大家分享关于MongoDB数据库索引的优点,索引的类型,索引的创建等等,有这方面学习需要的朋友可以了解看看,下面我们一起来了解MongoDB索引。
MongoDB 正则表达式 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。 许多程序设计语言都支持利用正则表达式进行字符串操作。 MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。 MongoDB使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。 不同于全文检索,我们使用正则表达式不需要做任何配置。 考虑以下 posts 集合..
mongodb使用方法:使用mongoimport --db dbName --collection collectionName --file filePath命令导入json文件,然后就可以在mongodb中使用json文件。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008