索引

在本页面

索引支持 MongoDB 中查询的高效执行。如果没有索引,MongoDB 必须执行集合扫描 i.e。扫描集合中的每个文档,以选择匹配查询语句的那些文档。如果查询存在适当的索引,MongoDB 可以使用索引来限制它必须检查的文档数。

索引是特殊的数据结构[1],它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或字段集的 value,按字段的 value 排序。索引条目的 ordering 支持有效的等式匹配和 range-based 查询操作。此外,MongoDB 可以使用索引中的 ordering 返回排序结果。

下图说明了使用索引选择和排序匹配文档的查询:

使用索引选择和 return 排序结果的查询图。索引以升序 order 存储score值。 MongoDB 可以在升序或降序 order 中遍历索引以_return 排序结果。

从根本上说,MongoDB 中的索引与其他数据库系统中的索引类似。 MongoDB 在采集 level 定义索引,并支持 MongoDB 集合中任何字段或 sub-field 文档的索引。

默认_id 索引

MongoDB 在创建集合期间在_id字段上创建独特的指数_id索引阻止 clients 插入两个具有_id字段相同 value 的文档。您不能在_id字段上删除此索引。

注意
分片簇中,如果不使用_id字段作为碎片 key,则 application 必须确保_id字段中值的唯一性以防止错误。这是通过使用标准 auto-generated ObjectId来完成的。

创建索引

Mongo Shell
要在Mongo Shell中创建索引,请使用db.collection.createIndex()

db.collection.createIndex( <key and index type specification>, <options> )

以下 example 在name字段上创建单个 key 降序索引:

db.collection.createIndex( { name: -1 } )

如果尚不存在相同规范的索引,则db.collection.createIndex方法仅创建索引。


罗盘

重要
要在 MongoDB Compass 中创建集合的索引,集合必须包含文档。

要在MongoDB 指南针中创建索引,请完成以下步骤:

  • 导航到要为其创建索引的集合:

  • 在 left-hand MongoDB Compass 导航窗格中,单击目标集合所属的数据库。

  • 从数据库视图中,单击目标集合 name。

  • 单击“索引”选项卡:

指南针索引选项卡

  • 单击“创建索引”按钮:

指南针索引按钮

出现以下对话框:

  • (可选)输入索引 name。

将此字段留空会导致 MongoDB Compass 为索引创建默认 name。

  • 将字段添加到索引。

使用对话框的“配置索引定义”部分可以定义索引的字段及其各自的类型。要在多个字段上创建索引,请单击“添加其他字段”。

  • (可选)指定索引选项。

可以指定以下索引选项:


蟒蛇
要使用Python 驱动程序创建索引,请使用pymongo.collection.Collection.create_index()

db.collection.create_index([(<key and index type specification>)], <options> )

以下 example 在name字段上创建单个 key 降序索引:

collection.create_index([("name", pymongo.DESCENDING)])

如果尚不存在相同规范的索引,则pymongo.collection.Collection.create_index()方法仅创建索引。


Java(同步)
要使用Java 驱动程序创建索引,请使用com.mongodb.client.MongoCollection.createIndex

collection.createIndex( <key and index type specification>, <options> )

以下 example 在name字段上创建单个 key 降序索引:

collection.createIndex(Indexes.descending("name"));

com.mongodb.client.MongoCollection.createIndex。方法仅在相同规范的索引尚不存在时才创建索引。


Node.js
要使用Node.JS 司机创建索引,请使用createIndex()

collection.createIndex( { <key and index type specification> }, function(err, result) {
   console.log(result);
   callback(result);
}

以下 example 在name字段上创建单个 key 降序索引:

collection.createIndex( { name : -1 }, function(err, result) {
   console.log(result);
   callback(result);
}

如果尚不存在相同规范的索引,则createIndex()方法仅创建索引。


**** PHP
要使用PHP 驱动程序创建索引,请使用MongoDB\Collection::createIndex()

$collection->createIndex(<key and index type specification>, <options>);

以下 example 在name字段上创建单个 key 降序索引:

$collection->createIndex(['name' => -1]);

如果尚不存在相同规范的索引,则MongoDB\Collection::createIndex()方法仅创建索引。


发动机
要使用电机驱动器创建索引,请使用motor.motor_asyncio.AsyncIOMotorCollection.create_index()

await db.collection.create_index([(<key and index type specification>)], <options> )

以下 example 在name字段上创建单个 key 降序索引:

await collection.create_index([("name", pymongo.DESCENDING)])

如果尚不存在相同规范的索引,则motor.motor_asyncio.AsyncIOMotorCollection.create_index()方法仅创建索引。


Java(异步)
要使用异步 Java 驱动程序创建索引,请使用com.mongodb.async.client.MongoCollection.createIndex

collection.createIndex( <key and index type specification>, <options>, <callbackFunction>)

以下 example 在name字段上创建单个 key 降序索引:

collection.createIndex(Indexes.descending("name"), someCallbackFunction());

如果尚不存在相同规范的索引,则com.mongodb.async.client.MongoCollection.createIndex方法仅创建索引。


C#
要使用.NET 司机创建索引,请使用MongoCollection.CreateIndex

collection.CreateIndex( IndexKeys<collection>.<key and index type specification>, <options> );

以下 example 在name字段上创建单个 key 降序索引:

collection.CreateIndex( IndexKeys<collection>.Descending("name") );

如果尚不存在相同规范的索引,则MongoCollection.CreateIndex方法仅创建索引。


****的 Perl
要使用Perl 驱动程序创建索引,请使用create_one()

my $indexes = $db->get_collection( <collection> )->indexes;
$indexes->create_one( [ <key and index type specification> ] );

以下 example 在name字段上创建单个 key 降序索引:

my $indexes = $db->get_collection( <collection> )->indexes;
$indexes->create_one( [ name => -1 ] );

如果尚不存在相同规范的索引,则create_one()方法仅创建索引。


红宝石
要使用Ruby 驱动程序创建索引,请使用Mongo::Index::View#create_one

client[:collection].indexes.create_one({ <key and index type specification> }, {options})

以下 example 在name字段上创建单个 key 降序索引:

client[:collection].indexes.create_one({ name: -1 })

如果尚不存在相同规范的索引,则Mongo::Index::View#create_one方法仅创建索引。


**_**斯卡拉
要使用Scala 司机创建索引,请使用org.mongodb.scala.model.Indexes

collection.createIndex(<key and index type specification>)

以下 example 在name字段上创建单个 key 降序索引:

collection.createIndex(descending("name"))

如果尚不存在相同规范的索引,则org.mongodb.scala.model.Indexes方法仅创建索引。


[1]MongoDB 索引使用 B-tree 数据结构。

索引类型

MongoDB 提供了许多不同的索引类型来支持特定类型的数据和查询。

单场

除 MongoDB-defined _id索引外,MongoDB 还支持在单个字段的文档上创建 user-defined ascending/descending 索引。

“得分”字段(升序)上的索引图。

对于 single-field 索引和排序操作,索引 key 的 sort order(i.e.升序或降序)无关紧要,因为 MongoDB 可以在任一方向上遍历索引。

有关 single-field 索引的更多信息,请参见单场索引使用单字段索引排序

复合指数

MongoDB 还支持多个字段 i.e 上的 user-defined 索引。 复合指数

复合索引中列出的字段 order 具有重要意义。例如,如果复合索引由{ userid: 1, score: -1 }组成,则索引首先按userid排序,然后在每个userid value 中按score排序。

userid字段(升序)和score字段(降序)的复合索引图。索引首先按userid字段排序,然后按score字段排序。

对于复合索引和排序操作,索引键的 sort order(i.e.升序或降序)可以确定索引是否可以支持排序操作。有关 index order 对复合索引结果的影响的更多信息,请参见排序

有关复合索引的更多信息,请参见复合指数在多个字段上排序

多键索引

MongoDB 使用多键索引索引存储在数组中的内容。如果索引包含 array value 的字段,则 MongoDB 会为 array 的每个元素创建单独的索引条目。这些多键索引允许查询通过匹配数组的元素或元素来选择包含数组的文档。如果索引字段包含 array value,则 MongoDB 自动确定是否创建多键索引;您不需要显式指定多键类型。

addr.zip字段上的多键索引图。 addr字段包含一个 array 的地址文档。地址文档包含zip字段。

有关多键索引的更多信息,请参见多键索引多键索引边界

地理空间索引

为了支持对地理空间坐标数据的有效查询,MongoDB 提供了两个特殊索引:2 d 索引在返回结果时使用平面几何,而2 dsphere 索引使用球形几何来返回结果。

有关地理空间索引的高级_3 级介绍,请参阅2 d 指数内部

文字索引

MongoDB 提供text索引类型,支持在集合中搜索 string 内容。这些文本索引不会 store language-specific 停用单词(e.g. “the”,“a”,“或”),并将集合中的单词仅限于 store 根单词。

有关文本索引和搜索的更多信息,请参见文字索引

散列索引

为了支持基于散列的分片,MongoDB 提供了一个哈希指数类型,它索引字段 value 的哈希值。这些索引在其范围内具有更随机的值分布,但仅支持相等匹配且不能支持 range-based 查询。

索引 Properties

独特的索引

索引的独特 property 会导致 MongoDB 拒绝索引字段的重复值。除了唯一约束之外,唯一索引在功能上可与其他 MongoDB 索引互换。

部分索引

version 3.2 中的新内容。

部分索引仅索引集合中满足指定过滤器表达式的文档。通过索引集合中文档的子集,部分索引具有较低的存储要求,并降低了索引创建和维护的性能成本。

部分索引提供了稀疏索引功能的超集,应该优先于稀疏索引。

稀疏索引

索引的 property 确保索引仅包含具有索引字段的文档的条目。索引会跳过没有索引字段的文档。

您可以将稀疏索引选项与唯一索引选项组合,以拒绝具有字段重复值的文档,但忽略没有索引 key 的文档。

TTL 指数

TTL 指数是 MongoDB 可以用于在一定量的 time 之后自动从集合中删除文档的特殊索引。这对于某些类型的信息非常理想,例如机器生成的 event 数据,日志和 session 信息,这些信息只需要在数据库中持续有限的 time 时间。

有关 implementation 说明,请参阅:通过设置 TTL 使集合中的数据过期

索引使用

索引可以提高读取操作的效率。 分析查询 Performance教程提供了包含和不包含索引的查询的执行统计信息的示例。

有关 MongoDB 如何选择要使用的索引的信息,请参阅查询优化器

索引和整理

version 3.4 中的新内容。

整理允许用户为 string 比较指定 language-specific 规则,例如字母和重音标记的规则。

Mongo Shell

罗盘

重要
MongoDB Compass 不支持索引的排序规则。
以下示例说明了Mongo Shell中的索引和排序规则。


蟒蛇

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


Java(同步)

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


Node.js

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


**** PHP

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


发动机

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


Java(异步)

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


C#

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


****的 Perl

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


红宝石

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


**_**斯卡拉

注意
以下示例说明 Mongo Shell 中的索引和排序规则。
有关在特定驱动程序中使用排序规则创建索引的说明,请参阅驱动程序文档


要使用索引进行 string 比较,操作还必须指定相同的排序规则。也就是说,如果操作指定了不同的排序规则,则具有排序规则的索引不能支持对索引字段执行 string 比较的操作。

对于 example,集合myColl在 string 字段category上有一个索引,其中包含整理 locale "fr"

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

以下查询操作(指定与索引相同的排序规则)可以使用索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

但是,以下查询操作(默认情况下使用“简单”二进制文件夹)无法使用索引:

db.myColl.find( { category: "cafe" } )

对于索引前缀键不是 strings,数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。

对于 example,集合myColl在数字字段scoreprice以及 string 字段category上具有复合索引;使用用于 string 比较的排序规则 locale "fr"创建索引:

db.myColl.createIndex(
   { score: 1, price: 1, category: 1 },
   { collation: { locale: "fr" } } )

以下操作(使用"simple"二进制排序规则进行 string 比较)可以使用索引:

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

以下操作在索引的category字段上使用"simple"二进制排序规则进行 string 比较,可以使用索引仅满足查询的score: 5部分:

db.myColl.find( { score: 5, category: "cafe" } )

有关排序规则的详细信息,请参阅整理参考页面

以下索引仅支持简单的二进制比较,不支持整理

涵盖的查询

当查询条件和查询的投影仅包含索引字段时,MongoDB 直接从索引返回结果,而不扫描任何文档或将文档带入 memory。这些覆盖的查询可以非常有效。

仅使用索引来匹配查询条件并 return 结果的查询图。 MongoDB 不需要检查索引之外的数据来完成查询。

有关覆盖查询的更多信息,请参阅涵盖查询

指数交叉点

version 2.6 中的新内容。

MongoDB 可以使用索引的交集来完成查询。对于指定复合查询条件的查询,如果一个索引可以满足查询条件的一部分,而另一个索引可以满足查询条件的另一部分,则 MongoDB 可以使用两个索引的交集来完成查询。使用复合索引还是使用索引交集更有效取决于特定查询和系统。

有关索引交集的详细信息,请参阅指数交叉点

限制

某些限制适用于索引,例如索引键的长度或每个集合的索引数。有关详细信息,请参阅指数限制

其他考虑因素

虽然索引可以提高查询性能,但索引也提出了一些操作注意事项有关更多信息,请参见索引的操作注意事项

如果您的集合包含大量数据,并且您的 application 需要能够在构建索引时访问数据,请考虑在后台构建索引,如背景建设中所述。

有关索引 build process 的更多信息,请参阅索引对已填充集合的构建操作,包括在副本 Sets 和 Sharded Clusters 上建立索引部分。

某些驱动程序可以使用NumberLong(1)而不是1作为规范来指定索引。这对结果索引没有任何影响。

Updated at: 9 months ago
数据库参考Table of content单场索引