热门标签 | 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()能对你的优化查询有很大的益处。加油!


推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 模板引擎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锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
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社区 版权所有