mongo 个应用了多个过滤器和排序的索引

mongo indexes where multiple filters & sorts are applied

假设我有以下架构:- collection 姓名- Test

{
"uid": "5e0e6a804888946fa61a1976",
"name": "abc",
"bookName":"xyz",
"rating": 5,
"category":"aa",
"isbn":"45656"
}

我的主要查询是通过 "uid" 找到测试 collection。 用例是,用户可以根据否进行过滤。字段和任意组合。 对于 eg 1:。他 selects name :'abc', 和 selects 'rating' as '5', 下一个eg 2:;他可以 select cat: "some cat"name :"some name".

在模式上建立 indexes/compound 索引的有效方法是什么?这将适用于任何组合和任何编号。 select 用户编辑的字段。我怎样才能让它覆盖使用索引的查询? currently for eg1: 我可以创建索引- {name:1, rating:1} for eg2: 我可以创建索引- {cat:1, name:1} 但是在没有定义用户如何 select 过滤器的顺序的情况下?我该如何解决?我是否需要为每个可能的组合创建所有索引?

请帮忙,并提出任何想法。

我的查询在 find 上是动态的,基于用户 selection 在过滤器上,但 uid 是不变的。

没有处理 'any number of fields in any combination' 种情况的灵丹妙药。您必须决定哪些查询对您的应用程序最重要,并创建支持它们的索引。不那么频繁的查询可能最好只部分支持。

The best overall strategy for designing indexes is to profile a variety of index configurations with data sets similar to the ones you'll be running in production to see which configurations perform best. Inspect the current indexes created for your collections to ensure they are supporting your current and planned queries. If an index is no longer used, drop the index.[1]

为什么不为每个可能的字段组合创建所有索引?因为

Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. Consider the relative frequency of each query in the application and whether the query justifies an index.[1] (emphasis mine).

因此,您需要提前仔细计划您的查询,或者设置一个暂存环境并观察出现的查询模式,以及 trim 不能证明其存在的索引。

最后,我的个人建议是确保您了解 ESR 规则[2],并创建多个牢记此规则的复合索引,然后密切关注您的 MongoDB 部署的执行情况。数据访问模式最终可能不像最初看起来那么随意。

而且我绝不是要告诉您 ESR 规则是您唯一需要了解的内容,以便提出有效的索引策略。还有更多。 [3]

[1] https://www.mongodb.com/docs/manual/applications/indexes

[2] https://www.mongodb.com/docs/manual/tutorial/equality-sort-range-rule

[3]https://www.mongodb.com/blog/post/performance-best-practices-indexing