【问题标题】:Spring Data MongoDB sort performanceSpring Data MongoDB 排序性能
【发布时间】:2014-10-22 08:12:08
【问题描述】:

我发现 Spring Data MongoDB 排序性能存在显着差异,具体取决于方向。我正在对一个属性进行排序,并且在两个方向都有索引。升序排序时响应时间约为 80 毫秒,降序排序时响应时间约为 2.7 秒。 原生查询分别需要 5 毫秒和 50 毫秒。后续页面的查询要快一些,大约 1 秒。

我的应用无法接受2.7s,有什么办法吗?

控制器:

String q = URLDecoder.decode(query);
Sort.Direction d = Sort.Direction.ASC;

if (direction == -1) {
    d = Sort.Direction.DESC;
}

String[] properties = sort.split(",");
Sort s = new Sort(d, Arrays.asList(properties));
Pageable p = new PageRequest(page, size, s);

List<Employer> list = employerRepository.find(q, p);

存储库:

@Override
public List<Employer> find(String query, Pageable page) {
    Query q = new BasicQuery(query).with(page);
    return mongoTemplate.find(q, Employer.class);
}

更新 1: 我已在 MongoDB 上启用分析,并且本机和 Spring Data 查询看起来相同。所以看来瓶颈在mongoTemplate.find(q, Employer.class);

【问题讨论】:

  • 你试过在属性上放置一个明确的索引吗?应该让事情变得更快 - 我们目前正在调查并且有一个索引似乎会对结果产生巨大影响。
  • 谢谢,我尝试添加.withHint("myindexname"),它显着提高了性能。令人惊讶的是(至少对我来说),当我再次删除它时,性能仍然很好。谁能解释一下?

标签: java spring mongodb spring-data spring-data-mongodb


【解决方案1】:

尽管sortDBCursorPageable 之间存在联系,但我认为不能直接将您遇到的性能不佳归咎于 Spring Data。

Spring Data 使用 DBCursor 从特定的 DBCollection 读取值。根据Pageable提供的参数sort,设置skiplimit。查询执行后,DBCursor 将按您的预期关闭。

显然,如果您可以在两者之间重用游标,您将获得更好的性能,但这会引入可能导致其他问题的共享状态。

但是,让我们仔细看看当我们尝试对结果进行分页,而不是重用游标,使用和不使用纯 MongoDB 驱动程序 API 进行排序时会发生什么。

对于示例,我们使用一个包含 10.000 个 Person 元素的集合,其名称范围为“foo0”到“foo10000”。

for (int pageNumber = 0; pageNumber < 1000; pageNumber++) {
    DBCursor c = collection.find(new BasicDBObject("name", new BasicDBObject("$regex", "foo*")))
        .skip(pageNumber * 10)//
        .limit(10)//
        .sort(new BasicDBObject("name", -1)); // comment this line to see the difference

    DBObject o = null
    while (c.hasNext()) {
        o = c.next();
    }
    c.close();
}

这需要在我的机器上使用 48278 ms,如果没有排序子句,它将下降到 2862 ms

由于如果您不使用 Spring Data MongoDB 也会发生这种行为,我认为导致此问题的原因更有可能在 MongoDB java 驱动程序中找到,但此时我无法在MongoDB 问题跟踪器...

【讨论】:

  • 如果删除while-loop 并立即关闭光标会发生什么?
  • @injecteer 在这种情况下,任何东西都不会从 MongoDB 中获取......非常快 - 但不确定这是否有意义?还是我错过了什么?
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2017-06-03
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多