结论:
1、 200w数据,合理使用索引的情况下,单个stationId下4w数据。mongodb查询和排序的性能理想,无正则时client可以在600ms+完成查询,qps300+。有正则时client可以在1300ms+完成查询,qps140+。
2、 Mongodb的count性能比较差,非并发情况下client可以在330ms完成查询,在并发情况下则需要1-3s。可以考虑估算总数的方法,http://blog.sina.com.cn/s/blog_56545fd30101442b.html
测试环境:mongodb使用 replica set,1主2从,96G内存,版本2.6.5
Mem消耗(4个200w数据的collection):
空间消耗(测试数据最终选定的collection):
Jvm: -Xms2G -Xmx2G
Ping延迟33ms
查询都使用ReadPreference.secondaryPreferred()
无正则
1、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:20000
查询条件:多条件查询10条记录,并逐条获取记录
String key = "清泉" + r.nextInt(1000);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append("dealCount", new BasicDBObject("$gt", r.nextInt(1000000))); DBCursor cursor = collection.find(queryObject).limit(10).skip(2);
并发:200
耗时:61566
单次耗时(server):124ms
Qps:324.85
2、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:20000
查询条件:多条件查询10条记录排序,并逐条获取记录
String key = "清泉" + r.nextInt(100);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{4, 20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append("dealCount", new BasicDBObject("$gt", r.nextInt(1000000))); DBCursor cursor = collection.find(queryObject)
.sort(new BasicDBObject("firmId", 1)).limit(10).skip(2);
并发:200
耗时:63187
单次耗时(server):119ms
Qps:316.52
3、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:2000
查询条件:多条件查询记录数
String key = "清泉" + r.nextInt(100);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{4, 20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append("dealCount", new BasicDBObject("$gt", r.nextInt(1000000)));
long count = collection.count(queryObject);
并发:200
耗时:21887
单次耗时(client):280ms
Qps:91.38
有正则
4、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:20000
查询条件:多条件查询10条记录,并逐条获取记录
String key = "清泉" + r.nextInt(1000);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append ("dealCount", new BasicDBObject("$gt", r.nextInt(1000000)))
.append("firmName", pattern);
DBCursor cursor = collection.find(queryObject).limit(10).skip(2);
并发:200
耗时:137673
单次耗时(server):225ms
Qps:145.27
5、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:20000
查询条件:多条件查询10条记录排序,并逐条获取记录
String key = "清泉" + r.nextInt(1000);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{4, 20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append ("dealCount", new BasicDBObject("$gt", r.nextInt(1000000)))
.append("firmName", pattern);
DBCursor cursor = collection.find(queryObject)
.sort(new BasicDBObject("firmId", 1)).limit(10).skip(2);
并发:200
耗时:138673
单次耗时(server):230ms
Qps:144.22
6、 创建stationId, firmId复合引查询场景(200w集合,12个字段)
查询次数:2000
查询条件:多条件查询记录数
String key = "清泉" + r.nextInt(1000);
Pattern pattern = Pattern.compile(key);
BasicDBObject queryObject = new BasicDBObject("stationId",
new BasicDBObject("$in", new Integer[]{4, 20}))
.append("firmId", new BasicDBObject("$gt", 5000))
.append ("dealCount", new BasicDBObject("$gt", r.nextInt(1000000)))
.append("firmName", pattern);
long count = collection.count(queryObject);
并发:200
耗时:23155
单次耗时(client):330ms
Qps:86.37
MongoDB索引特点
1、 复合索引必须命中首字段,否则无法生效。后面的字段可以不按顺序命中。
2、 复合索引字段越多占用空间越大,但对查询性能影响不大(数组索引除外)。
3、 会根据sort字段选择索引,优先级超过复合索引中的非首字段。
4、 命中复合索引的情况下,数据量<10w的情况下,过滤非索引字段,效率也比较高。
5、 全文检索性能比较差,200w数据命中50w的情况下,全文检索需要10+s,正则需要1s。
6、不走索引的字段,如果用于查询,创建schema尽量靠前,可以提升查询效率。
7、索引覆盖查询,如果检索条件,排序字段和查询字段都是索引中的字段,会省去从文档中Load数据的过程,查询会更快。
MongoDB客户端配置,可以提出来做成spring注入,设置最大连接数什么的。
MongoClientOptions options =
MongoClientOptions.builder().maxWaitTime(1000 * 60 * 2)
.connectionsPerHost(500).build();
mongoClient = new MongoClient(Arrays.asList(new ServerAddress("10.205.68.57", 8700),
new ServerAddress("10.205.68.15", 8700),
new ServerAddress("10.205.69.13", 8700)), options);
mongoClient.setReadPreference(ReadPreference.secondaryPreferred());
参考文档
《深入学习MongoDB》
http://blog.163.com/wm_at163/blog/static/132173490201110254257510/
http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#getting-started-with-java-driver
http://mongoing.com/tj/microshard-ycsb //压力测试
http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html //命令
http://www.361way.com/mongo-mem/1489.html //内存监控
http://www.oschina.net/translate/mongodb-text-search-tutorial?cmp 全文检索
http://www.oschina.net/translate/mongodb-indexing-tip-3-too-many-fields-to-index-use //复合索引
http://blog.sina.com.cn/s/blog_56545fd30101442b.html 分页
mongoDB调研_结论.docx为最终场景下的测试数据,分为有正则和无正则。
mongoDB调研_remote.docx为测试验证过程中的数据,有可能存在缓存等情况,不一定准确,功参考。
- 大小: 14.6 KB
- 大小: 34.2 KB
- 大小: 49.1 KB
- 大小: 55.9 KB
- 大小: 44.8 KB
分享到:
相关推荐
主要介绍了MongoDB查询性能验证及优化的相关知识,涉及到MongoDB 查询优化原则知识点,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重...
《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重...
Mysql性能优化之索引优化 写实现Tomcat服务器 移动后台端框架设计 公司级框架原理解析 解密公司内部框架开发(打造属于自己的专属框架) 手写Tomca之深度解析动态资源请求原理 深度解析springMVC实现原理(手写...
性能优化使用Facebook的数据加载器的示例 端到端测试 安装 git clone git@github.com:the-road-to-graphql/fullstack-apollo-express-mongodb-boilerplate.git cd fullstack-apollo-express-m
如果您有兴趣,我会很乐意为您提供帮助,尤其是在测试和性能优化方面! 请发送请求请求。 目标 集成的节点,例如其他蒙戈库和 。 加入仅取决于node-mongodb-native Db客户端,希望这将使之相对容易。 性能优化。 ...
⼆是验证数据持久化⾄mongodb等库的效率等等 数据处理 在本阶段,我们验证map reduce任务的执⾏效率,重点关注的是数据处理的效率。当然这个过程可能也会涉及到数据的持久化相关指标,例如存储⾄HDFS读 写效率等等...
优化器(主要对执行的 SQL 优化选择最优的执行方案方法) 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)-> 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果) 索引相关 3、...
优化器(主要对执行的 SQL 优化选择最优的执行方案方法) 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)-> 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果) 索引相关 3、...
拥有众多的优秀功能和特性,经历了三年多发展的同时,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和 改进,众多的典型案例确保可以稳定用于商业以及门户级的开发。 ThinkPHP借鉴了国外很多优秀的...
采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,...
关于MyQEE ... ... ...* MyQEE是一套轻量级的框架,但不是简陋的框架,系统具备完善的底层类库和强大的扩展功能设计;...Swift Storage 驱动完善,token验证支持v1和v2版本,优化参数传送方式,支持url方式的配置
它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且文件名包括哈希值。 您的应用已准备好进行部署! 有关更多信息,请参见关于的部分。npm run eject 注意:这是单向操作。 eject ,...
校园招聘网站课程设计是一个针对大学生职业发展的教学项目,旨在帮助...测试与优化:进行系统测试,包括功能测试、性能测试、安全测试等,并根据测试结果进行优化。 项目部署:将网站部署到服务器,并进行维护和更新
在线考试系统是一种基于互联网的教育技术工具,用于...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
•数据库增加对 group_concat 的支持,MongoDB数据库驱动支持在group查询中使用distinct查询,修复MongoDB驱动力中查询slave在新的版本里可能导致连接失败的问题 •增加 BigInt 类库 •日期类库完善 •HttpClient...
它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。生成被最小化,并且文件名包括哈希值。您的应用已准备好进行部署!有关更多信息,请参见关于的部分。npm run eject注意:这是单向操作。 eject ,您将...