索引
在此页面上
Overview
在本指南中,您可以了解如何使用 Rust 驱动程序创建和管理索引。索引是 MongoDB 中用于提高查询性能的特殊数据结构。
如果在没有任何索引的集合上执行查询,MongoDB 会扫描每个文档以查找匹配项。这些集合扫描很慢,可能会对应用程序的性能产生负面影响。当您创建涵盖查询的索引时,MongoDB 会限制其检查以查找匹配项的文档数量,从而提高性能。
查询覆盖和性能
下表描述了可以包含在 MongoDB 查询中的元素:
元素 | 说明 |
---|---|
查询 | Required Specifies the fields and values to match |
选项 | Optional Specify how the query executes |
投射 | Optional Specifies the fields that MongoDB returns in matched
documents |
Sort | Optional Specifies the order of documents returned |
当查询元素引用全部包含在同一索引中的字段时,MongoDB 可以直接从索引返回结果。 这些查询称为覆盖查询。
要学习;了解如何确保索引覆盖查询,请参阅服务器手册中的覆盖查询。
重要
排序条件
您的排序条件必须与索引的顺序一致或相反。
假设一个collection在 上具有以下索引,name
字段按升序 (AZ) 排列,age
字段按降序排列 (9-0):
name_1_age_-1
当您采用以下任一配置对文档进行排序时,MongoDB 会使用此索引:
name
升序,age
降序name
降序,age
升序
如果为两个字段指定相同的排序顺序,则 MongoDB 不使用索引,而是执行内存中排序。
操作注意事项
要提高查询性能,请为查询中经常出现的字段创建索引。 但是,追踪索引内存和磁盘使用情况以进行容量规划是一个好习惯,因为每个索引都会消耗磁盘空间和内存。此外,如果写入操作更新了索引字段,MongoDB 还必须更新相关索引。
MongoDB 支持动态模式,因此您的应用程序可以查询具有未知名称或变量名称的字段。 如果您连接到 MongoDB Server 4.2或更高版本,则可以创建通配符索引来支持这些查询。 要了解有关此索引类型的更多信息,请参阅 MongoDB Server手册中的 通配符索引 。
索引类型
MongoDB 支持多种索引类型来支持您的查询。 以下部分介绍了常见的索引类型,并展示了如何在集合中创建每种索引类型。
您可以使用create_index()
和create_indexes()
方法在collection中创建索引。create_index()
方法接受一个IndexModel
结构体参数,您可以使用该类型的builder()
方法来构造该参数。
要查看索引类型的完整列表,请参阅 MongoDB Server手册中的 索引类型 。
单字段索引
单个字段索引包含对文档字段的引用。
该索引提高了单字段查询和排序的性能。 它还支持TTL索引,可在一定时间后自动从集合删除文档。 要学习;了解有关TTL索引的更多信息,请参阅服务器手册中的TTL索引。
当您创建新集合时,MongoDB 会自动在_id
字段上创建唯一的单字段索引。
例子
以下代码在sample_training.zips
collection中的city
字段上创建一个升序索引:
let index = IndexModel::builder().keys(doc! { "city": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1
复合索引
复合索引包含对多个文档字段的引用。
该索引提高了对多个字段进行查询和排序的性能。 创建复合索引时,必须为每个索引字段指定一个方向。
您可以使用与创建单字段索引相同的语法来创建多键索引。
例子
以下代码在sample_training.zips
collection 中的city
和pop
字段 上创建复合索引:
let index = IndexModel::builder() .keys(doc! { "city": 1, "pop": -1 }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1_pop_-1
多键索引(数组字段索引)
多键索引包含对数组值字段的引用。此索引提高了对数组字段的查询性能。
您可以使用与创建单字段索引相同的语法来创建多键索引。
例子
tags
sample_training.posts
以下代码在collection中的 字段上创建多键索引:
let index = IndexModel::builder().keys(doc! { "tags": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: tags_1
聚集索引
聚集索引可提高对聚集集合的插入、更新和删除操作的性能。聚集集合按聚集索引键值的顺序存储文档。要了解有关这些集合的更多信息,请参阅服务器手册中的聚集集合。
只有在创建collection时才能创建集群化索引。要创建集群化集合,请执行以下步骤:
创建一个
ClusteredIndex
实例。调用
create_collection()
方法。将
clustered_index()
方法链接到create_collection()
方法,将ClusteredIndex
实例作为clustered_index()
的参数传递。
您必须设置ClusteredIndex
结构的以下字段:
key
字段,用于指定密钥模式。此字段的值必须是{ _id: 1 }
。unique
字段,指定索引的唯一性。 此字段的值必须是true
。
ClusteredIndex
要创建自动使用所需值的实例,您可以调用该类型的default()
方法。
例子
以下代码在数据库sample_training
中创建名为collectionitems
的新集合时,在字段_id
上创建具有默认配置的集群索引:
let db = client.database("sample_training"); let cl_idx = ClusteredIndex::default(); db.create_collection("items") .clustered_index(cl_idx) .await?;
Text Indexes
文本索引支持对字符串内容进行文本搜索查询。 该索引引用具有字符串值或字符串数组值的字段。MongoDB 支持多种语言的文本搜索。 创建文本索引时,可以指定默认语言作为选项。
一个集合只能包含一个文本索引。 要在多个文本字段上创建文本索引,可以创建复合索引。 在创建复合索引后运行文本Atlas Search时, Atlas Search操作将对复合索引中的所有文本字段运行。
例子
body
sample_training.posts
以下代码在collection集合中的字段字段上创建文本索引。该代码设置一个选项以将"spanish"
指定为文本索引的默认语言:
let idx_opts = IndexOptions::builder() .default_language("spanish".to_string()) .build(); let index = IndexModel::builder() .keys(doc! { "body": "text" }) .options(idx_opts) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: body_"text"
地理空间索引
MongoDB 通过使用2dsphere
索引支持包含地理空间坐标数据的查询。 您可以使用 GeoJSON 对象值在字段上创建2dsphere
索引。
此索引类型支持以下任务:
查询地理空间数据以查找包含项、交集和邻近范围
欧几里得平面上的距离计算
重要
不能对同一字段创建两个地理空间索引。
例子
sample_mflix.theaters
集合中的以下示例文档包含字段location.geo
。 该字段具有 GeoJSON point 值:
{ "_id": ..., "theaterId": ..., "location": { "address": ..., "geo": { "type": "Point", "coordinates": [ -93.24565, 44.85466 ] } } }
以下代码在collection中的字段 上创建地理空间2dsphere
索引:location.geo
sample_mflix.theaters
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
Unique Indexes
唯一索引可确保索引字段不存储重复值。 默认,当您创建collection时,MongoDB 会在_id
字段上创建唯一的单字段索引。
要创建唯一索引,请指定要保持唯一性的字段或字段组合,并将 unique
选项设置为 true
。
例子
以下代码演示如何在IndexOptions
实例中将unique
字段设置为true
,并在创建IndexModel
时传递这些选项:
let opts = IndexOptions::builder().unique(true).build(); let index = IndexModel::builder() .keys(doc! { "_id": -1 }) .options(opts) .build();
删除索引
您可以删除collection中除_id
字段上的默认唯一索引之外的任何索引。要删除索引,请将索引的名称传递给drop_index()
方法。
提示
删除所有索引
您可以使用drop_indexes()
方法一次性删除collection上除_id
索引之外的所有索引。
city_1
sample_training.zips
以下示例从collection中删除名为 的索引:
my_coll.drop_index("city_1".to_string()).await?;
更多信息
要了解有关设计数据模型和为应用程序创建适当索引的更多信息,请参阅 MongoDB Server手册中的 索引策略 和 操作因素和数据模型 。
要了解如何执行读取操作,请参阅读取操作类别中的指南。
要了解有关本指南中提到的概念的更多信息,请参阅以下服务器文档:
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: