【赵强老师】MongoDB中的索引(上)
索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。
一、索引的基础知识
下面以关系型数据库Oracle为例,介绍索引的基本原理,如下图所示:
从上图可以看成,索引的本质其实就相当于是一本书的目录。当查询表中数据的时候,先查询目录(索引)中的行地址,再通过行地址查询到表中的数据,从而提高查询的性能。
下图说明了在MongoDB中,索引在查询和排序中是如何工作的?
通过这个例子,可以清楚的看到索引存储的是一个特定字段或者几个字段的集合,并且按照一定的规律排序。当创建集合的时候,MongoDB自动在_id上创建一个唯一性索引,由于是唯一性的,所以可以防止重复的_id值插入到集合中。通过getIndexes可以查询到MongoDB集合上的索引信息,如下图所示。
当没有索引的时候,通过查看执行计划,可以看到查询的过程,如下:查询:10号部门,工资小于3000的文档。
那么如何创建一个简单的索引呢?注意从mongoDB 3.0开始ensureIndex被废弃,今后都仅仅是db.collection.createIndex的一个别名。
现在在deptno和sal上建立一个索引,并重新查看执行计划:db.emp.createIndex({"deptno":1,"sal":-1})
注意:除了可以使用explain()生成执行计划外,还可以有几个可选的参数,如下:
.explain("allPlansExecution")
.explain("executionStats")
.explain("queryPlanner")
二、索引的类型一:单键索引(Single Field)
单键索引是最普通的索引,与_id索引不同,单键索引不会自动创建。
准备数据: db.testindex1.insert({"_id":1,"zipcode":1034,"location":{state:"NY",city:"New York"}}) 在单个列上创建单键索引: db.testindex1.createIndex({"zipcode":1}) 在嵌套的列上创建单键索引 db.testindex1.createIndex({"location:state":1}) 在内嵌的文档上创建单键索引 db.testindex1.createIndex({"location":-1}) 这样将会把location作为一个整体。
三、索引的类型二:多键索引(Multikey Index)
多键索引与单键索引创建形式相同,区别在于字段的值。值具有多个记录,如数组。
如上图,基于集合上的数组创建多键索引,且数组为内嵌文档。
准备数据: db.testindex2.insertMany([ { _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] }, { _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] }, { _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] }, { _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] }, { _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }]) 下面基于ratings列创建一个多键索引: db.testindex2.createIndex( { ratings: 1 } ) 查询数组上为5,9的文档 db.testindex2.find( { ratings: [ 5, 9 ] } ) 下面查看其执行计划 db.testindex2.find( { ratings: [ 5, 9 ] } ).explain()

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
理解协程、LiveData 和 Flow
从 API 1 开始,处理 Activity 的生命周期 (lifecycle) 就是个老大难的问题,基本上开发者们都看过这两张生命周期流程图: △ Activity 生命周期流程图 随着 Fragment 的加入,这个问题也变得更加复杂: △ Fragment 生命周期流程图 而开发者们面对这个挑战,给出了非常稳健的解决方案: 分层架构。 分层架构 △ 表现层 (Presentation Layer)、域层 (Domain Layer) 和数据层 (Data Layer) 如上图所示,通过将应用分为三层,现在只有最上面的 Presentation 层 (以前叫 UI 层) 才知道生命周期的细节,而应用的其他部分则可以安全地忽略掉它。 而在 Presentation 层内部也有进一步的解决方案: 让一个对象可以在 Activity 和 Fragment 被销毁、重新创建时依然留存,这个对象就是架构组件的 ViewModel 类。下面让我们详细看看 ViewModel 工作的细节。 如上图,当一个视图 (View) 被创建,它有对应的 ViewModel 的引用地址 (注意 ViewMo...
- 下一篇
大厂 Git 提交规范整理
git是现在市面上最流行的版本控制工具,书写良好的commit message能大大提高代码维护的效率。但是在日常开发中由于缺少对于commit message的约束,导致填写内容随意、质量参差不齐,可读性低亦难以维护。在项目中引入commit message规范已是迫在眉睫。 一、市场主流规范 现在市面上比较流行的方案是约定式提交规范(Conventional Commits),它受到了Angular提交准则的启发,并在很大程度上以其为依据。约定式提交规范是一种基于提交消息的轻量级约定。它提供了一组用于创建清晰的提交历史的简单规则;这使得编写基于规范的自动化工具变得更容易。这个约定与SemVer相吻合,在提交信息中描述新特性、bug 修复和破坏性变更。它的 message 格式如下: 二、git commit 规范化工具 —— commitizen 1. 全局安装commitizen & cz-conventional-changelog commitizen是一个撰写合格commit message的工具,用于代替git commit 指令,而cz-conv...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7安装Docker,走上虚拟化容器引擎之路