热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一起飞系列之:浅谈Mongodb的索引优化

难度水平:初中级适用人群:对Mongodb数据查询已经一定经验的码农,了解explain()的用法。阅读时间:10分钟缘起本来是打算回答一个网友的问题,不过回复框太小而且功能不全(
难度水平:初中级
适用人群:对Mongodb数据查询已经一定经验的码农,了解explain()的用法。
阅读时间:10分钟

缘起

本来是打算回答一个网友的问题,不过回复框太小而且功能不全(差评^o^),于是乎就成就了本文的产生。在这里我主要就是想跟大家分享一下我对Mongodb索引的粗浅理解,抛砖引玉,希望能对一些人有所帮助。

对于数据库的索引相信大家都不陌生,主要功能就是在数据库内提高针对特定信息的访问速度。那么在Mongodb里面索引是怎样被引用跟查找的呢?下面我来通过几个例子给大家分享一下我的心得体会。

Mongodb基础数据查询

举个栗子,按照城市查询车牌号码系统。为了方便演示,我在所有查询后面都加入了explain()函数。要注意explain的返回结果集中的一下选项:

  • cursor – 索引项
  • n – 查询结果的条目总数
  • nscanned – 扫描并读取的索引条目数(index)
  • nscannedObjects – 扫描并读取的全文条目数(documents)
  • indexOnly – 是否使用了covered indexes功能,宝宝不哭,后面有详述。
  • millis – 查询用时,单位是毫秒。

栗子1: 在没有索引的情况下查询全部北京车牌号码

db.carLicence.find({city:'Beijing'}).explain()
//返回结果如下:
{
"cursor" : "BasicCursor",
"n" : 1563247,
"nscannedObjects" : 96539732,
"nscanned" : 96539732,
"indexOnly" : false,
"millis" : 156, // 哭!
}

BasicCursor表示全文检索。上面的例子说明,在没有索引的情况下,该查询语句查询了整个数据集carLicence。该数据集包含了96539732数据,其中1563247属于北京车牌。整个用时为156毫秒.

小结: 一定要避免没有索引的全文查询

栗子2: 在没有索引的情况下,使用limit(1000)来查询北京车牌号码

db.carLicence.find({city:'Beijing'}).limit(1000).explain()
//返回结果如下:
{
"cursor" : "BasicCursor",
"n" : 1000,
"nscannedObjects" : 18476396,
"nscanned" : 18476396,
"indexOnly" : false,
"millis" : 85, // 擦干眼泪!
}

这个例子说明,Mongodb在搜索满1000个条目之后就停止继续检索了。

小结: 尽量使用limit()来处理你的数据查询

栗子3: 添加索引

因为我们只是需要得到北京市的车牌号码,所以在我们的例子中涉及到了2个索引信息,一个是城市city,另外一个就是车牌号码licence。那么我们来给这2个信息添加索引,来查询全部北京车牌号码。

注意:给2个以上的字段建立索引叫做Compound Index复合索引[多字段索引),hashed字段不能创建索引。建立方法如下db.carLicence.ensureIndex( { “city”: 1, “licence”: 1 } )

db.carLicence.find({city:'Beijing'}).explain()
//返回结果如下:
{
"cursor" : "BasicCursor city_1_licence_1",
"n" : 1563247,
"nscannedObjects" : 1563247,
"nscanned" : 1563247,
"indexOnly" : false,
"millis" : 47, // 只剩 擦!
}

相信看到这里,大家已经对所有的功效有了一个初步的认识了。

小结 – 尽量给涉及到的条目建立索引

那么,indexOnly的covered indexes功能会有什么样的提高呢?好让我们来看最后这个例子。

栗子4: 使用覆盖索引 Covered Indexes

db.carLicence.find({city:'Beijing'}, {licence:1, _id:0}).explain()
//返回结果如下:
{
"cursor" : "BasicCursor city_1_licence_1",
"n" : 1563247,
"nscannedObjects" : 0,
"nscanned" : 1563247,
"indexOnly" : true, // 变了 变了 !
"millis" : 41, // 擦!擦!擦!
}

最后这个例子涉及到了covered indexes(覆盖索引),通常来说,覆盖索引只在查询文档的索引字段时候使用。但是有几个特性跟附加条件要遵循.

  • 查询字段必须是索引字段
  • 要去掉_id因为是返回的Object. 通过_id:0来实现。
  • 索引字段不能是. 也就是说在explain()里面,如果isMultiKey:true的话indexOnly一定是false.

另外一个就是在最后一个栗子里面nscannedObjects是零,这是因为我们只是提取了索引里面的目录条licence,并不需要每一条的全部数据(document),加上”indexOnly” : true,所以, Mongodb直接从索引里面提取了数据licence,不用再去查询物理数据集carLicence得到相关全文信息。所以nscannedObjects为零。

小结 – 在只提单字段数据的前提下,要给对应的但字段建立索引索引

结语

粗浅的分析一下我对索引的理解跟一些优化体验。有兴趣的朋友可以共通研究。最后说一句,善用explain()能对你的优化查询有很大的益处。加油!


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
开卷_汤娅造_673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有