我正在开发一个使用 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));
现在,我面临的问题是索引使第二个查询比没有索引更快,但在第一个查询索引的情况下比没有索引慢。
为什么?当查询和相应的索引几乎相同时,为什么第一个查询变得更慢?
如果你知道,请帮我解释一下,或者如果我做错了什么。
谢谢你, 纳拉扬
“低基数”的索引键会导致读取速度比直接收集扫描慢。在这种情况下,索引将成为额外费用。
嵌入文档中的两个键似乎具有不同的基数。 user_id 应该比 org_id 具有更多的基数,这可能是在索引辅助对 user_id 的查询时,对 org_id 的索引产生了不利影响的原因。
一般来说,低基数字段不适合索引,因为它会产生不利影响。
请参阅有关基数的问题和解答。 Mongodb 低基数索引
谢谢 我们做最好的4你