mongoDB index introduction
索引为mongoDB的查询提供了有效的解决方案,如果没有索引,mongodb必须的扫描文档集中所有记录来match查询条件的记录。然而这些扫描是没有必要,而且每一次操作mongod进程会处理大量的数据。
索引是一种存储文档集中一部分数据集的特殊的数据结构,以便更容易的去遍历。索引存储了一个通过value排序具体字段或者字段集。
mongodb的索引和其他数据库系统的索引基本上相同。mongodb的索引在文档集collection层面上,并且支持文档集的任何字段或复合字段上面建索引。
一个合适的索引会大大减少mongoDB检索文档集的次数。在某些情况下,mongoDB可以用索引去判断哪些记录复合查询条件。
下图阐释了一个利用索引的查询:
diagram of a query selecting documents using an index. MongoDB narrows the query by scanning the range of documents with values of score less than 30.
Tip
Create indexes to support common and user-facing queries. Having these indexes will ensure that MongoDB only scans the smallest possible number of documents.
索引也可以优化性能在以下具体情况:
排序结果集
mongodb可以直接返回用索引排序文档,不需要额外的排序阶段。
Covered Results
当查询条件规则和查询的映仅仅包括索引字段,mongoDB将直接从索引数据里返回结果集,不需要扫描任何文档,不需要将文档放入内存。这些覆盖的查询将会非常高效。而且,这些索引也可以covers聚合管道的操作。
索引类型
mongoDB提供了一系列的索引类型来支持具体的数据和查询。
Default _id
默认情况,mongoDB所有的collections都有一个索引在_id字段,如果应用没有具体为_id字段制定一个具体的driver,mongod将会创建一个值为ObjectID的_id字段。
_id的索引是唯一索引,不允许客户端插入_id字段值相同的两条记录。
Single Field (单一字段)
为了补充mongoDB自定义的_id索引,mongoDB支持用户在文档的单个字段上面自定义索引。下图是单一索引的说明:

Diagram of an index on the score field (ascending).
Compound Index(复合索引)
MongoDB也支持用户在符合的字段上面自定义索引,这些复合索引和单一字段索引类似;然而,当查询条件依赖于额外的字段,复合索引中字段的顺序会有很大的影响。举个例子来说,如果一个复合索包括{ userid: 1, score: -1 },索引首先通过userid排序,然后通过score的value排序,下图是复合索引的说明:

Diagram of a compound index on the userid field (ascending) and the scorefield (descending). The index sorts first by the userid field and then by thescore field.
Multikey Index(多键索引)
mongoDB用多键索引为存储数组内容的字段做索引,如果你的索引字段包含一个数组,MongoDB创建单独的索引为数组里面的每一个元素。这些多键索引允许查询去选择包含数组中某个元素或者所有元素。MongoDB自动的决定是否创建多键索引当索引字段中包含数组,你不需要明确的去制定多建类型。下图为多键索引的说明:

Diagram of a multikey index on the addr.zip field. The addr field contains an array of address documents. The address documents contain the zip field.
Geospatial Index(地理空间索引)
为了有效支持地理空间坐标数据的查询,mongoDB提供了两个特殊的索引:
2d indexes 返回结果用平面几何 ,2sphere indexes 返回结果用球面几何
See 2d Index Internals for a high level introduction to geospatial indexes.
Text Indexes(文本索引)
MongoDB为文档中字符串内容提供一个测试版的文本类型的索引。这些文本索引不存储特定语言的停顿词 (e.g. “the”, “a”, “or”) 。
See Text Indexes for more information on text indexes and search.
Hashed Indexes(哈希索引)
为了支持基于哈希的分片,mongoDB提供了哈希索引类型。哈希索引通过字段的哈希值来检索,这些索引有更随机的分布,但是不适用于对于基于范围的查询
Index Properties(索引的属性)
Unique Indexes
唯一索引不允许索引重复索引字段值。如果要在一个已经有重复的字段上面见索引,see Drop Duplicates for index creation options.除了唯一约束,唯一索引和MongoDB的其他索引可以互换。
Sparse Indexes
索引稀疏的属性确保索引仅仅包含文档集中有索引字段的的实体,索引忽略文档中没有索引字段的记录。你可以联合稀疏索引和唯一索引来约束文档中重复的值忽略文档中没有索引key的记录。
mongoDB index introduction的更多相关文章
- MongoDB Index
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要 ...
- MongoDB Chapter1:Introduction
你是在防火墙后面吗? 为了继续本课程,您必须能够将计算机的传出请求发送到我们在MongoDB Atlas中设置的数据库服务器.这些服务器在Amazon AWS中的端口27017上运行. 请单击http ...
- mongodb index 的background 及集群的索引建立
在数据库建立索引时,默认时"foreground" 也就是前台建立索引,但是,当你的数据库数据量很大时,在建立索引的时会读取数据文件,大量的文件读写会阻止其他的操作,此时在建立索引 ...
- MongoDB 使用Index
Index 能够提高查询的性能,如果没有Index,MongoDB必须扫描整个collection,从collection的第一个doc开始,直到最后一个doc,即使第一个doc之后的所有doc都不满 ...
- MongoDB之TextSearch简介
MongoDB之TextSearch简介 MongoDB支持对文本内容执行文本搜索操作,其提供了索引text index和查询操作$text来完成文本搜索功能.下面我们通过一个简单的例子来体验一下M ...
- 深入浅出Symfony2 - 结合MongoDB开发LBS应用
简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在的项目也正从事相关系统的开发,我们使用的是S ...
- MongoDB 入门之基础 DML
此文章主要记录部分主要的 MongoDB Collection 的 DML 操作. 文章中的 Collection 名字为 yourColl,每一次操作包含以下两条初始数据 { "_id&q ...
- 结合MongoDB开发LBS应用
然后列举一下需求:1.实时性要高,有频繁的更新和读取2.可按距离排序支持分页3.支持多条件筛选(一个经纬度数据还包含其他属性,比如社交系统的性别.年龄) 方案简单介绍:1.sphinx geo索引支持 ...
- MongoDB备份数据库&导入数据库
今天需要对线上的MongoDB中的webpage库进行备份,然后在本地导入备份的库. 1.备份整个MongoDB数据库 mongodump -h dbhost --port 端口 -u 用户名 -p ...
随机推荐
- Shell命令_smem
监控各个进程.用户的内存使用情况 基础条件:需要安装yum工具 centos 7.0 1.安装smem [root@VM_31_182_centos src]# yum install smem py ...
- 常用的一些linux命令
最近接触到一些linux环境部署的事情,下面分享一些最近使用的比较频繁的一些linux命令~ 1.一次性移动多个文件到一个文件夹里 mv 被移动文件名 -t 目标文件夹 如:mv a.txt b.t ...
- MYSQL批量修改表前缀与表名sql语句
修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', ta ...
- <Script>放置位置
html文件是自上而下的执行方式 css引入执行加载时,程序仍然往下执行 script脚本是则中断线程,待该script脚本执行结束之后程序才继续往下执行 页面效果实现类的js放在body之前,动作, ...
- maven项目project facets中是2.3调整为3.0的解决办法
以前情况下直接直接调整到3.0下面的按钮就会变成不可以点,当把前面的勾取掉就可以点击apply了,之后再次把勾勾上,点击apply有个弹窗默认是webcontent.在maven项目中改成src/ma ...
- 一篇对iOS音频比较完善的文章
转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...
- bzoj 2141: 排队
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...
- SolrQuery的使用
查询的总结:一般查询分为以下几个步骤: 1.创建查询对象 2.创建查询条件 3.执行查询,这里注意要有返回值 4.对查询结果进行取出 public void queryDocument() throw ...
- PHP数组函数总结
array_change_key_case - 返回字符串键名全为小写或大写的数组 array_chunk - 将一个数组分割成多个 array_column - 返回数组中指定的一列 array_c ...
- 浅谈ListView滑动隐藏显示ToolBar
引言 在App日益追求体验的时代,优秀的用户体验往往会使产品脱颖而出.今天我们就来介绍一种简单的滑动ListView来显示或者隐藏ToolBar的功能. 布局文件 下面我们来看一下这个主界面的布局文件 ...