创建索引以支持您的查询
当索引包含查询扫描的所有字段时,索引覆盖查询。覆盖查询扫描索引而不是集合,从而提高查询性能。
如果查询的某些字段是索引的一部分,索引也可以部分支持查询。
关于此任务
单个集合可以拥有最多64个索引。然而,在达到这个限制之前,过多的索引可能会降低性能。对于写读比例高的集合,索引可能会降低性能,因为每次插入都必须更新任何索引。
步骤
识别常见查询
为了识别应用程序中的常见查询模式,请使用$queryStats
聚合阶段。$queryStats
报告了基于共享字段的查询形状的指标。
创建索引以支持常见查询
在您知道应用程序经常查询哪些字段后,您可以创建支持这些字段查询的索引。更多信息,请参阅示例.
分析索引使用情况
在应用程序开始使用索引后,您可以分析索引的有效性。要查看索引统计信息和使用情况,您可以
使用
$indexStats
聚合阶段。对于MongoDB Atlas部署,在Atlas UI中查看索引。
考虑删除未使用的索引以提高应用程序性能。更多信息,请参阅移除不必要的索引。
定期重复此过程,以确保您的索引支持当前的工作负载。
示例
创建单键索引
如果你的应用程序只在给定的集合上查询单个键,那么你需要为该集合创建单键索引。例如,你可以在product
集合中的category
上创建索引
db.products.createIndex( { category: 1 } )
前面的索引支持此查询
db.products.find( { category: "electronics" } )
创建复合索引
如果你的应用程序同时在单个键和多个键上执行查询,那么复合索引比单键索引更高效。例如,你可以在category
、item
和location
字段上创建索引
db.products.createIndex( { category: 1, item: 1, location: 1 } )
索引前缀
复合索引支持查询索引前缀,即索引字段的起始子集。例如,前面的索引支持以下查询
db.products.find( { category: "electronics" } ) db.products.find( { category: "electronics", item: "television" } )
有关索引前缀的更多信息以及性能考虑,请参阅索引前缀。
创建支持文本搜索的索引
对于托管在MongoDB Atlas上的数据,您可以使用Atlas Search索引支持全文搜索。有关更多信息,请参阅创建Atlas Search索引。
对于自管理的(非Atlas)部署,MongoDB提供了一种支持在集合中搜索字符串内容的text
索引类型。有关自管理文本索引的更多信息,请参阅自管理部署中的文本索引。
创建向量搜索索引
向量搜索索引支持对向量嵌入的查询。要创建向量搜索索引,请参阅向量搜索索引字段。
索引使用和排序规则
为了使用索引进行字符串比较,操作还必须指定相同的排序规则。也就是说,具有排序规则的索引不支持在指定不同排序规则的操作上执行字符串比较。
警告
由于配置了排序规则的索引使用ICU排序规则键来达到排序顺序,因此具有排序意识的索引键可能比未配置排序规则的索引键更大。
例如,集合 myColl
在字符串字段 category
上有一个索引,排序规则区域设置为 "fr"
。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
以下指定与索引相同排序规则的查询操作可以使用该索引
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
然而,以下默认使用“简单”二进制比较器的查询操作无法使用索引
db.myColl.find( { category: "cafe" } )
对于索引前缀键不是字符串、数组或嵌套文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持索引前缀键的比较。
例如,集合 myColl
在数值字段 score
和 price
以及字符串字段 category
上有一个复合索引;该索引创建时使用了排序规则区域 "fr"
来进行字符串比较
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
以下使用 "simple"
二进制比较器进行字符串比较的操作可以使用该索引
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
以下使用 "simple"
二进制比较器在索引字段 category
上进行字符串比较的操作可以使用索引来仅满足查询的 score: 5
部分
db.myColl.find( { score: 5, category: "cafe" } )
重要
对文档键(包括嵌套文档键)的匹配使用简单二进制比较。这意味着查询键如“foo.bár”将不会匹配键“foo.bar”,无论您为强度参数设置的值。