原文地址

一、介绍

我们已经很清楚索引会提高查询效率。如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档。对查询来说如果存在合适的索引,则MongoDB可以利用索引减少扫描的文档数。

索引是一种特殊的数据结构,其中存储了集合的数据集的一小部分,以便容易遍历。索引本质上存储的其实是单个字段或者字段组的值,并根据字段值进行排序。索引的排序支持有效的相等比较和基于范围的查询操作。另外,MongoDB通过索引中的排序返回存储的结果。

下图说明了一个查询并对匹配文档利用索引排序:

MongoDB的索引通常与其他数据库系统中的索引类似。MongoDB在集合这一层定义索引,并对一个集合中的任何字段或者文档的子字段支持索引操作。

注:MongoDB索引使用B树数据结构

索引类型

MongoDB提供一系列不同的索引类型以支持不同的数据和查询

默认 _id

所有的MongoDB集合有一个_id字段上的索引,这个索引是默认存在的。如果程序没有特别指定_id的值,那驱动程序或者Mongod将创建一个_id字段,其值为ObjectId。

_id索引是唯一的,并且不允许客户端插入两个_id字段相同的文档。

单字段

除了默认_id上的索引,MongoDB支持文档中单个字段上的用户自定义的索引创建,此索引可以是升序,也可以是降序。

对单字段索引和排序操作来说,索引键的排序顺序(升序或降序)无所谓,因为MongoDB可以从另一个方法遍历索引。

复合索引

MongoDB也支持对多字段的用户自定义索引,即,复合索引。

复合索引中字段的顺序是有意义的。例如,如果一个复合索引的组成为{userid:1, score: -1},那索引排序为首先对userid升序排序,然后对于userid相同的文档,按score的降序排序。

对复合索引和排序操作来说,索引键的排序顺序(升序或降序)将决定这个索引是否支持某种排序操作。详情可参见复合索引的索引顺序对最终排序顺序的影响。

参考复合索引多字段排序可获取复合索引的更多信息。

多键索引(Multikey Index)

MongoDB使用多键索引对存储在数组中的内容进行加索引。如果对一个拥有数组值的字段加索引,MongoDB创建此数组的每个元素上的索引。多键索引允许查询选择包含数组字段的文档,而匹配条件可以是数组的一个或多个元素。如果要被加索引的字段包含一个数组值,并且客户端不明确指定多键类型,那么MongoDB会自动决定是否创建多键索引。

如果要获取多键索引的更多信息,参见多键索引多键索引边界

以下可参考原文,点击此处跳转

地理空间索引(Geospatial Index)

...

...

MongoDB索引(一)的更多相关文章

  1. [DataBase] MongoDB (7) MongoDB 索引

    MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...

  2. MongoDB索引介绍

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  3. MongoDB(索引及C#如何操作MongoDB)(转载)

    MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...

  4. MongoDB 索引篇

    MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...

  5. MongoDB索引的种类与使用

    一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索 ...

  6. MongoDB索引,性能分析

    索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...

  7. MongoDB索引原理

    转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...

  8. MongoDB · 引擎特性 · MongoDB索引原理

    MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...

  9. MongoDB索引管理

    一.创建索引 创建索引使用db.collectionName.ensureIndex(...)方法进行创建: 语法: >db.COLLECTION_NAME.ensureIndex({KEY:1 ...

随机推荐

  1. 【NOIP2014】DAY2题解+代码

    T1 傻逼题……不想写贴昨年代码了. 总之随便怎么搞都能过. 15年的DAY2T1怎么那么毒瘤真是越活越倒退] #include <iostream> #include <fstre ...

  2. ng1笔记

    AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序. ng-model 指令把元素值(比如输入域的值)绑定到应用程序. ...

  3. 【转】深入理解Major GC, Full GC, CMS

    声明:本文转自http://blog.csdn.net/iter_zc/article/details/41825395,转载务必声明. 很多人都分不清Major GC, Full GC的概念,事实上 ...

  4. 破译情报-NOIP2016提高组复赛模拟试题

    [题目描述] 最近国安人员截获了一份 RB 国的秘密情报, 全文都是经过加密的,每个单 词都很长.破译人员想到先把单词化简一下,方法是把每个单词尽量取短些的前 缀,但所取的前缀不能是其他单词的前缀. ...

  5. 阿里云Linux服务器挂载硬盘分区

    查看所有硬盘与分区 fdisk -l 运行命令 fdisk /dev/xvdb 根据提示,依次输入 n p 1    (数字一 不是 L) 回车 回车 w 提示 Syncing disks.时,表示已 ...

  6. c++设计模式-----抽象工厂模式

    抽象工厂模式 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML类图 抽象基类: 1)AbstractProductA.Abstrac ...

  7. 编译 ORB_SLAM2 (一)

    之前有记录关于ORB_SLAM的第一个版本的编译,每次就是要编译程序,都会遇到很多问题,并不是所谓的按照教程来就一定能编译成功,所以这一次编译也遇到了很多问题.百度的时候也看到网上有很多相似的问题,但 ...

  8. dev Gridcontrol根据其cell里面的值显示不同颜色

    要改变cell值得颜色 需要用到cellTemplate和convert <DataTemplate x:Key="PercentageCellColorTemplate"& ...

  9. centos 安装 ntpdate 并同步时间

    1.安装ntp yum install -y ntp 2.与一个已知的时间服务器同步 # time.nist.gov 是一个时间服务器 ntpdate time.nist.gov 3.删除本地时间并设 ...

  10. Qt对ini文件的读写

    研究了以下Qt下ini文件的读写,不废话,上干货. 写入ini文件 WriteIni.cpp void WriteIni::writeSettings() { QSettings settings(& ...