使用嵌入式对象在 MongoDB 中建立索引

问题描述 投票:0回答:1

我正在开发一个使用 MongoDB 作为数据库的 Spring Boot 项目。我正在嵌入对象上应用索引,这会减慢一个查询的速度,但会加快类似查询的速度。

我有一个 MongoDB 集合,其结构有点像这样:

UserDetails user_details;
String doc_no;
String txn_date;

user_details 是一个嵌入式对象,具有以下结构:

String user_id;
String org_id;

我在 Spring Data MongoDB 中编写了以下两个查询:

Query query = new Query();
query.addCriteria(Criteria.where("user_details.org_id").is(orgId));
query.with(Sort.by(Sort.Direction.DESC, "txn_date"));
mongoTemplate.find(query,MyClass.class)

带有索引:

mongoTemplate.indexOps("myclass").ensureIndex(new Index().on("user_details.org_id", Sort.Direction.DESC));

还有,

Query query = new Query();
query.addCriteria(Criteria.where("user_details.user_id").is(userId).and("doc_no").is(docNo));
query.with(Sort.by(Sort.Direction.DESC, "txn_date"));
mongoTemplate.find(query,MyClass.class)

带有索引:

mongoTemplate.indexOps("myclass").ensureIndex(new Index().on("user_details.user_id", Sort.Direction.DESC));

现在,我面临的问题是索引使第二个查询比没有索引更快,但在第一个查询索引的情况下比没有索引慢。

为什么?当查询和相应的索引几乎相同时,为什么第一个查询变得更慢?

如果你知道,请帮我解释一下,或者如果我做错了什么。

谢谢你, 纳拉扬

mongodb spring-boot spring-data-mongodb database-indexes
1个回答
0
投票

“低基数”的索引键会导致读取速度比直接收集扫描慢。在这种情况下,索引将成为额外费用。

嵌入文档中的两个键似乎具有不同的基数。 user_id 应该比 org_id 具有更多的基数,这可能是在索引辅助对 user_id 的查询时,对 org_id 的索引产生了不利影响的原因。

一般来说,低基数字段不适合索引,因为它会产生不利影响。

请参阅有关基数的问题和解答。 Mongodb 低基数索引

谢谢 我们做最好的4你

© www.soinside.com 2019 - 2024. All rights reserved.