2014-10-22 123 views
2

根据方向的不同,我看到Spring Data MongoDB排序性能存在显着差异。我正在对一个属性进行排序,并在两个方向上都有索引。排序升序时,响应时间大约为80毫秒,排序时降序大约为2.7秒。 原生查询分别需要5毫秒和50毫秒。后续页面的查询速度更快,大约1秒。Spring Data MongoDB排序性能

2.7秒对我的应用程序是不可接受的,有什么我可以做的吗?

控制器:

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数据查询看起来相同。所以看起来瓶颈在mongoTemplate.find(q, Employer.class);

+0

你有没有尝试把一个显式的索引属性?应该让事情变得更快 - 我们目前正在调查,并有一个指数似乎大规模影响结果。 – 2014-10-23 09:35:25

+0

谢谢,我尝试添加'.withHint(“myindexname”)',它显着提高了性能。令人惊讶的是(至少对我来说),当我再次移除它时,表现依然不错。任何人都可以解释吗? – user3170702 2014-10-23 11:44:47

回答

1

我认为,弹簧数据不能直接归咎于你遇到的相当差的表现,虽然sort,DBCursorPageable之间有连接。

春数据应用DBCursor从特定DBCollection读值。根据Pageable提供的参数sortskiplimit被设置。查询执行后,DBCursor按照您的预期关闭。

所以,很显然你会得到更好的性能,如果你能重新使用游标之间,但这将引入会导致其他问题的共享状态。

但是让我们在当我们在搜索结果中尝试网页,而不是重用光标,不管有没有那种只使用普通的MongoDB驱动API会发生什么一探究竟。

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

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问题跟踪器...

+0

如果你删除while循环并立即关闭游标会发生什么? – injecteer 2014-10-23 11:54:57

+1

@injecteer在这种情况下,从MongoDB中将不会获取任何内容......相当快 - 但不知道这是否合理?或者我错过了什么? – 2014-10-23 13:20:49

+0

啊对不起,我错过了一点:) – injecteer 2014-10-23 13:26:27

相关问题