MongoDB Aggregation Framework的性能测试 - xbwen/xbwen.github.io GitHub Wiki
最近的项目中,需要在mongoDB的一个Collection中存储1亿多条数据,然后进行聚合统计操作。因此,做了个实验来测试MongoDB Aggregation Framework的性能。
Docuemnt数据模型如下:
@Entity(name="mock")
@EnsureIndex("{name:1}, {level:1}")
public class MockEntity extends SimpleEntity {
@Id
private String id;
private String name;
private int level;
//getter and setter...
}
插入10组数据,每组1千万条:
AdvancedDao<MockEntity> dao = new AdvancedDao<MockEntity>(MockEntity.class);
dao.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
for(char c='A'; c<='J'; c++){
for(int i=0; i<10000000; i++){
MockEntity mock = new MockEntity();
mock.setName("" + c + "-" + i);
mock.setLevel(new Random().nextInt(100));
dao.save(mock);
}
}
聚合查询最后面100万条数据的平均值,看看消耗了多少时间:
long start = System.currentTimeMillis();
AdvancedDao<MockEntity> dao = new AdvancedDao<MockEntity>(MockEntity.class);
DBObject match = dao.query().greaterThanEquals("name", "J-9000000").getCondition();
DBObject group = new BasicDBObject();
group.put("_id", null);
group.put("average", new BasicDBObject("$avg", "$level"));
Iterable<DBObject> results = dao.aggreage().match(match).group(group).results();
for(DBObject dbo : results){
System.out.println(dbo.get("average"));
}
long end = System.currentTimeMillis();
System.out.println("use time: " + (end - start));
在我的MacBookPro电脑上执行上述代码,输出的结果是:2563ms。
MongoDB Aggregation Framework的性能还是非常不错的,在笔记本上执行只花了2.5秒的时间,在服务器上能运行的更快,完全满足我们项目的要求。
有几个地方需要注意:
(1)记得建索引;
(2)Aggregate的时候,记得先用match、limit、skip等缩小数据量,再进行聚合操作。