封面图片学分:Digital Ocean
介绍
如果您在MongoDB中使用了indexes,那么您必须知道它们的重要性和巨大的绩效增长。它是使用MongoDB和索引的几乎每个项目的一部分,在改善查询执行性能中起着至关重要的作用。
问题
但是,索引并非没有成本。索引通常存储在内存中,但这可能并非一直如此。您的项目可能包含许多索引或一些大索引,并且您的计算机可用内存可能不足以容纳所有索引。
在这种情况下,将一些索引存储在内存中,而其余部分则存储在存储中。与内存访问相比,存储访问可能非常慢。因此,这可能会减慢您的查询执行。
一个办法
部分索引可在某种程度上用于减轻此问题。
部分索引是索引的一种空间效率技术,仅是那些最常查询的文档。例如,如果在线图书商店的客户在大部分时间内搜索具有3个或以上评级的书籍,那么仅将这些文档索引为3或以上的文档就足以满足大多数搜索的低延迟查询。这减少了所需索引的大小。
用法
以下是创建一个方法,假设收集名称为 book 和 penre 是文档架构中的一个字段:
db.books.createIndex(
{ genre: 1 },
{ partialFilterExpression: { rating: { $gte: 3 } } }
)
可以使用任何形式的索引,例如单键索引,多键索引甚至复合索引。
这是使用索引的方法:
db.books.find({ genre: "Astronomy", rating: { $gt: 3.5 } })
警告
必须在查询中是匹配的滤波器表达式,以触发任何部分索引的使用。在上面的示例中,将使用部分索引,因为额定值上的查询过滤器肯定会导致文档,这些文档构成了使用上述createIndex()
函数索引的文档的正确子集。
如果查询可以在索引索引之外产生一些文档,则不会使用部分索引,甚至不适用于使用部分索引来获取的文档。因此,您的查询需要确保部分索引之外没有任何文件可以被扫描。
结论
本质上,部分索引可以用于经常查询的文档上,并且您对这些查询的P90或P99潜伏期不太担心。这将有助于减少存储索引的内存要求。
注意
这篇文章的目的只是使开发人员意识到部分索引。
有关部分索引的更多详细信息,功能和用例,请访问official documentation。