2014-10-22 128 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

相關問題