Docs 菜单
Docs 主页
/ /

创建索引以支持查询

当索引包含查询扫描的所有字段时,该索引就涵盖了该查询。 覆盖查询会扫描索引而不是集合,从而提高查询性能。

如果对所查询字段的子集建立了索引,则索引还可以部分支持查询。

单个集合最多可以有64个索引。 但是,在达到该限制之前,过多的索引可能会降低性能。 对于写入读取比较高的集合,索引可能会降低性能,因为每次插入还必须更新任何索引。

1

要识别应用程序中的常见查询模式,请使用 $queryStats聚合阶段。 $queryStats报告查询结构的指标,该结构根据共享字段对查询进行群组。

2

了解应用程序经常查询哪些字段后,就可以创建索引来支持对这些字段的查询。 有关更多信息,请参阅示例。

3

应用程序开始使用索引后,您可以分析索引的有效性。 要查看索引统计信息和使用情况,您可以:

  • 使用$indexStats聚合阶段。

  • 对于MongoDB Atlas部署,请在Atlas 用户界面中查看索引

请考虑删除未使用的索引以提高应用程序性能。 有关更多信息,请参阅删除不必要的索引。

定期重复此过程,确保索引支持当前工作负载。

本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

注意

movies集合中的document包含此处未显示的其他字段。

如果应用程序仅查询给定集合中的单个键,则需要为该集合创建单键索引。 示例,您可以在movies集合中的title上创建索引:

db.movies.createIndex( { title: 1 } )

此索引支持此查询:

db.movies.find( { title: 'Mulholland Drive' } )

如果您的应用程序同时对单个键和多个键执行查询,则复合索引比单键索引更高效。 示例,您可以在yearruntimetitle字段上创建索引:

db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )

复合索引支持对索引前缀进行查询,索引前缀是索引字段的起始子集。示例,前面的索引支持此查询:

db.movies.find( { year: 2012, runtime: { $gt: Decimal128( "120" ) } }, { title: 1 } )

有关索引前缀的更多信息和性能注意事项,请参阅索引前缀。

对于MongoDB上托管的数据,您可以使用MongoDB搜索索引支持全文搜索。要学习;了解更多信息,请参阅创建MongoDB搜索索引。

对于自托管(非 Atlas)部署, MongoDB提供了 text索引类型,支持在集合中搜索string内容。 要学习;了解有关自管理文本索引的更多信息,请参阅自管理部署上的文本索引。

向量搜索索引支持对向量嵌入进行查询。 要创建向量搜索索引,请参阅向量搜索的索引字段。

要使用索引进行 string 比较,操作还必须指定相同的排序规则。如果操作指定的排序规则与索引指定的排序规则不同,则索引不支持对索引字段进行 string 比较。

警告

对于不带排序规则的索引,支持排序规则的索引键可能大于索引键,因为配置排序规则的索引使用 ICU 排序规则键来实现排序顺序。

后退

应用模式

在此页面上