gpt4 book ai didi

java - Spring Data MongoDB 排序性能

转载 作者:可可西里 更新时间:2023-11-01 10:43:28 32 4
gpt4 key购买 nike

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

2.7 秒对我的应用程序来说是 Not Acceptable ,我能做些什么吗?

Controller :

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 上启用了分析, native 查询和 Spring Data 查询看起来完全相同。所以瓶颈似乎在 mongoTemplate.find(q, Employer.class);

最佳答案

虽然 sortDBCursorPageable .

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 毫秒,没有排序子句这下降到 2862 毫秒

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

关于java - Spring Data MongoDB 排序性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26502939/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com