[英]Performance Mongodb java driver
我在我的項目中使用mongodb java驅動程序在一個大集合中執行查詢(查找,聚合,mapreduce,...)(500萬個文檔)
驅動程序版本是:
<!-- MongoDB driver-->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.3</version>
</dependency>
我的問題是當我使用api find和java中的一些過濾器時,操作需要15秒。
....
Iterable<Document> messageList = collection.find().filter(... some filters).sort(... fields);
// Find documents
for (Document message : messageList) {
....
// some code
....
}
我檢查mongo服務器日志文件,看到跟蹤是一個COMMAND而不是QUERY :
2015-09-01T12:11:47.496 + 0200 I COMMAND [conn503]命令b。$ cmd命令:count {count:“logs”,查詢:{timestamp:{$ gte:new Date(1433109600000)},aplicacion:“ APP1“,事件:”Event1“}} planSummary:IXSCAN {timestamp:1,aplicacion:1} keyUpdates:0 writeConflicts:0 numYields:19089 reslen:44 locks:{Global:{acquireCount:{r:19090}},MMAPV1Journal :{acquireCount:{r:19090}},數據庫:{acquireCount:{r:19090}},收藏:{acquireCount:{R:19090}}} 14297ms
如果我從mongodb客戶端(Robomongo)運行相同的查詢,則需要0.05毫秒。
db.getCollection('logs').find({ timestamp: { $gte: new Date(1427839200000) }, aplicacion: "APP1", event: "Event1" })
並在服務器日志中為QUERY
使用驅動程序java命令進行的所有查詢(查找,聚合,...)都會被轉換? 性能比mongo shell差很多。
我認為問題是當你在mongo shell中運行查詢時,它一次只返回前20個結果,在這里你試圖讀取所有文檔並將其放入數組中
試試這個查詢,看看
列表messageList = collection.find(filter).sort(... field).limit(20).into(new ArrayList());
強烈建議在查詢字段上創建索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.