索引的概述
什么是索引
索引支持在MongoDB中高效的执行,没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每一个文档,已选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟。
如果查询存在适当的索引,MongoDB可以使用改索引限制必须检查的文档数。
索引是特殊的数据结构,它以一种易于遍历的形式存储集合数据集的一小部分。索引存储一个或一组特定字段的值,按字段的值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以通过使用索引中的排序返回排序后的结果。
索引的类型
单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序降序索引称为单字段索引。
对于单个字段索引和排序操作,索引健的排序顺序并不重要,因为MongoDB可以在任何方向上遍历索引。
单键索引(Single Field Indexes)顾名思义就是单个字段作为索引列,mongoDB的所有collection默认都有一个单键索引_id,我们也可以对一些经常作为过滤条件的字段设置索引
复合索引
MingoDB还支持多个字段的用户定义索引,即复合索引
复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由{userid:1,score:-1}组成,则索引首先按userid正序排序,然后在每一个userid的值内,再按score倒序排序
复合索引(Compound Indexes)指一个索引包含多个字段,用法和单键索引基本一致。使用复合索引时要注意字段的顺序,如下添加一个name和age的复合索引,name正序,age倒序,document首先按照name正序排序,然后name相同的document按age进行倒序排序。mongoDB中一个复合索引最多可以包含32个字段。
其他索引
地理空间索引(Geospatial index)、文本索引(TextIndexes)、哈希索引(Hashed indexes)
地理空间索引(Geospatial index)
为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引,返回结果时使用平面几何的二维索引和返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引
文本索引(TextIndexes)
MongoDB提供了一种文本索引类型,支持在集合搜索字符串内容,这些文本索引不存储特定于语言的停止词而将集合中的词作为词干,只存储根词。
哈希索引(Hashed indexes)
为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但1只支持相等匹配,不支持基于范围的查询。
索引的管理操作
索引的查看
说明:返回一个集合中的所有索引的数组
语法:
db.collection.getIndexes()
索引的创建
说明:在集合上创建索引
语法:
db.collection.createIndex(keys,options)
参数:
该db.collection.createIndex()是围绕着一个包装 createIndexes命令。
为了最大程度地减少在副本集和分片群集上建立索引的影响,请使用滚动索引生成过程,如在副本集上建立索引所述。
选项
该options文档包含一组控制索引创建的选项。不同的索引类型可以具有特定于该类型的其他选项。
在版本3.4中进行了更改:添加了对归类选项的支持。
对于所有索引类型选项
除非另有说明,否则以下选项可用于所有索引类型:
以下索引仅支持简单的二进制比较,不支持排序规则:
文字索引
2d索引,以及
geoHaystack索引。
示例(单字段索引的添加 1什序 -1降序)
db.test.createIndex({userid:1})
复合索引的示例
db.test.createIndex({age:1,nickname:-1})
索引的移除
说明:可以移除指定的索引,或移除所有索引
一、指定索引的移除
db.collection.dropIndex(index)
参数
该db.collection.dropIndexes()是围绕着一个包装 dropIndexes命令。
示例
db.test.dropIndex({userid:1});
提示_id的字段的索引是无法删除的,只能删除非_id字段的索引。
索引的使用
执行计划
分析查询性能通常使用查询计划来查看查询的详情,如:查询耗费的时间、是否基于索引查询等。
那么、通常、我们想知道、建立的索引是否有效、效果如何、都需要执行计划查看。
语法:
db.collection.find(query,options).explain(options)
示例
db.test.find({userid:"1003"}).explain()
涵盖的查询
Covered Queies
当查询条件和查询的投影包含索引的字段时候,MongoDB直接从索引返回结果,而不扫描成文档或将文档带入内存。这些覆盖的查询可以非常有效。
db.collection.find({userid:"1003"},{userid:1,_id:0})
或者
db.collection.find({userid:"1003"},{userid:1,_id:0}).expain()