参考 > 指标
索引支持在MongoDB中高效执行查询。没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的那些文档。如果查询存在适当的索引,则MongoDB可以使用该索引来限制它必须检查的文档数。
索引是特殊的数据结构[1],它以易于遍历的形式存储集合数据集的一小部分。索引存储一个特定字段或一组字段的值,按该字段的值排序。索引条目的排序支持有效的相等匹配和基于范围的查询操作。另外,MongoDB可以使用索引中的顺序返回排序的结果。
下图说明了使用索引选择和排序匹配文档的查询:
从根本上讲,MongoDB中的索引类似于其他数据库系统中的索引。MongoDB在集合 级别定义索引,并支持MongoDB集合中文档的任何字段或子字段的索引。
_id
指数¶在创建集合期间,MongoDB 在_id字段上
创建唯一索引。该索引可防止客户端插入两个具有相同值的文档。您不能将此索引放在字段上。_id
_id
_id
注意
在分片群集中,如果您不使用_id
字段作为分片键,则您的应用程序
必须确保_id
字段中值的唯一性以防止错误。这通常是通过使用标准的自动生成的ObjectId来完成的。
要在Mongo Shell中创建索引
,请使用
db.collection.createIndex()
。
以下示例在name
字段上创建单个键降序索引:
db.collection.createIndex
仅当尚不存在相同规格的索引时,该方法才会创建索引。
重要
要在MongoDB Compass中的集合上创建索引,该集合必须包含文档。
要在MongoDB Compass中创建索引 ,请完成以下步骤:
要使用Python驱动程序创建索引
,请使用pymongo.collection.Collection.create_index()
。
以下示例在name
字段上创建单个键降序索引:
pymongo.collection.Collection.create_index()
仅当尚不存在相同规格的索引时,该方法才会创建索引。
要使用Java驱动程序创建索引 ,请使用 com.mongodb.client.MongoCollection.createIndex。
以下示例在name
字段上创建单个键降序索引:
该com.mongodb.client.MongoCollection.createIndex。仅当不存在相同规格的索引时,该方法才创建索引。
要使用PHP驱动程序创建索引
,请使用
MongoDB\Collection::createIndex()
。
以下示例在name
字段上创建单个键降序索引:
MongoDB\Collection::createIndex()
仅当尚不存在相同规格的索引时,该方法才会创建索引。
若要使用Motor驱动程序创建索引
,请使用
motor.motor_asyncio.AsyncIOMotorCollection.create_index()
。
以下示例在name
字段上创建单个键降序索引:
motor.motor_asyncio.AsyncIOMotorCollection.create_index()
仅当尚不存在相同规格的索引时,该方法才会创建索引。
要使用Async Java驱动程序创建索引 ,请使用 com.mongodb.async.client.MongoCollection.createIndex。
以下示例在name
字段上创建单个键降序索引:
该com.mongodb.async.client.MongoCollection.createIndex 方法只有在相同规格的索引不存在创建索引。
要使用.NET驱动程序创建索引 ,请使用 MongoCollection.CreateIndex。
以下示例在name
字段上创建单个键降序索引:
该MongoCollection.CreateIndex 方法只有在相同规格的索引不存在创建索引。
要使用Ruby驱动程序创建索引 ,请使用 Mongo :: Index :: View#create_one。
以下示例在name
字段上创建单个键降序索引:
该蒙戈::首页::查看#create_one 方法只有在相同规格的索引不存在创建索引。
要使用Scala驱动程序创建索引 ,请使用 org.mongodb.scala.model.Indexes。
以下示例在name
字段上创建单个键降序索引:
该org.mongodb.scala.model.Indexes 方法只有在相同规格的索引不存在创建索引。
[1] | MongoDB索引使用B树数据结构。 |
索引的默认名称是使用下划线作为分隔符的索引键和索引中每个键的方向(即1或-1)的串联。例如,在创建的索引
的名称为。{ item : 1, quantity: -1 }
item_1_quantity_-1
您可以使用自定义名称创建索引,例如比默认名称更易于阅读的名称。例如,考虑一个经常查询products
集合以填充现有清单上的数据的应用程序。以下createIndex()
方法在上创建索引item
并quantity
命名为:query for
inventory
您可以使用db.collection.getIndexes()
方法查看索引名称。一旦创建索引,您将无法重命名。相反,您必须删除并使用新名称重新创建索引。
MongoDB提供了许多不同的索引类型来支持特定类型的数据和查询。
除MongoDB定义的_id
索引外,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引。
对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)无关紧要,因为MongoDB可以沿任一方向遍历索引。
MongoDB还支持多个字段上的用户定义索引,即 复合索引。
复合索引中列出的字段顺序具有重要意义。例如,如果一个复合索引由组成,则索引首先按排序,然后在每个
值内按排序。{ userid: 1, score: -1 }
userid
userid
score
对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以确定索引是否可以支持排序操作。有关索引顺序对复合索引结果的影响的更多信息,请参见 排序顺序。
MongoDB使用多键索引来索引存储在数组中的内容。如果您对保存数组值的字段建立索引,则MongoDB将为数组的每个元素创建单独的索引条目。这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。如果索引字段包含数组值,MongoDB会自动确定是否创建多键索引。您无需显式指定多键类型。
为了支持对地理空间坐标数据的高效查询,MongoDB提供了两个特殊的索引:返回结果时使用平面几何的2d索引和使用球面几何返回结果的2dsphere索引。
有关地理空间索引的高级介绍,请参见2d Index Internals。
MongoDB提供了一种text
索引类型,该类型支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停用词(例如“ the”,“ a”,“ or”),并且在集合中词干仅存储根词。
3.2版中的新功能。
部分索引仅索引集合中符合指定过滤器表达式的文档。通过索引集合中文档的子集,部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本。
部分索引提供了稀疏索引功能的超集,应优先于稀疏索引。
3.4版的新功能。
归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
要将索引用于字符串比较,操作还必须指定相同的排序规则。即,具有排序规则的索引不能支持对索引字段进行字符串比较的操作(如果该操作指定了不同的排序规则)。
例如,该集合myColl
在category
具有排序规则语言环境的字符串字段上具有索引"fr"
。
以下查询操作指定与索引相同的排序规则,可以使用索引:
但是,默认情况下使用“简单”二进制整理程序的以下查询操作不能使用索引:
对于索引前缀键不是字符串,数组和嵌入式文档的复合索引,指定其他排序规则的操作仍可以使用索引来支持索引前缀键的比较。
例如,集合myColl
在数字字段score
和price
字符串字段
上具有复合索引category
;使用排序规则语言环境创建索引以
"fr"
进行字符串比较:
使用"simple"
二进制排序规则进行字符串比较的以下操作可以使用索引:
下面的操作使用"simple"
二进制排序规则对索引category
字段进行字符串比较,该操作可以使用索引仅满足查询的一部分:score: 5
有关整理的更多信息,请参见整理参考页。
以下索引仅支持简单的二进制比较,不支持排序规则: