结论:
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查询优化的基本原则至关重要。这包括: 1. **索引优化**:合理创建和使用索引能够显著提高查询速度。...
MongoDB作为一个NoSQL数据库,它的管理工具对于数据库的日常维护、性能优化和问题排查至关重要。通过这些工具,用户能够更高效地处理数据,进行备份、恢复,监控数据库性能,并进行复杂的查询操作,从而提升开发和...
索引是提升查询性能的关键,MongoDB支持多种类型的索引,如单字段索引、复合索引、文本索引、地理空间索引等。明智地创建和管理索引能显著提高查询速度。 六、复制集与分片 1. 复制集:为了确保数据的高可用性和...
8. MongoDB的性能优化:MongoDB的性能优化包括索引优化、查询优化、数据压缩和缓存等技术。 MongoDB的性能优化可以提高查询性能和数据处理能力。 9. MongoDB的应用场景:MongoDB的应用场景包括大数据处理、实时数据...
MongoDB 3.2 是MongoDB数据库系统的一个重要版本,发布于2016年,它带来了许多增强特性和性能优化。MongoDB是一款基于分布式文件存储的开源文档型数据库,以其灵活性、高性能和易用性而受到广大开发者的青睐。在3.2...
7. **查询优化器改进**:MongoDB 4.2的查询优化器进行了升级,能够更准确地选择执行计划,从而提高查询效率。 8. **安全增强**:除了字段级加密,4.2还增强了身份验证和授权机制,如SCRAM-SHA-256认证协议,提升了...
### MongoDB应用实战集群及系统架构 #### MongoDB简介 MongoDB是一种非常流行的开源文档数据库,它采用了NoSQL(非关系型数据库)技术,可以提供高性能、高可用性和易扩展性。MongoDB非常适合处理大规模数据和复杂...
对于MongoDB的性能评估和优化,手册提供了评估当前操作性能的方法,并指导用户如何优化查询和写入操作的性能。它还包括了如何分析查询性能和tailable cursors(一种特殊类型的游标)的内容。为了帮助用户更好地理解...
通过Compass,用户可以轻松地浏览和操作数据,查看索引,优化查询性能,以及进行数据导入导出等操作。 在安装MongoDB之前,你需要确保你的系统满足以下硬件和软件要求: 1. 操作系统:MongoDB支持多种操作系统,...
4. 连接MongoDB shell,验证安装是否成功,可以运行简单的查询和操作。 在使用MongoDB时,开发者和管理员还需要了解如何进行数据备份和恢复、设置复制集以实现高可用性,以及如何进行水平扩展以处理更大的负载。...
5. 性能优化:提供提高MongoDB性能的策略,如索引创建、查询优化和存储引擎选择。 6. 复制集与分片:阐述复制集的原理和配置,以及如何进行水平扩展使用分片技术。 7. 聚合框架:介绍聚合管道,用于处理数据流和进行...
4. **性能分析**:内置的性能监控工具可以帮助用户分析MongoDB服务器的运行状态,包括CPU使用率、内存消耗和I/O性能等,以便优化数据库性能。 5. **安全性**: Studio 3T 支持身份验证和权限管理,可以创建、编辑和...
10. **监控与管理工具**: MongoDB提供了一个名为MongoDB Compass的图形用户界面,方便用户进行数据浏览、查询优化和性能监控。此外,还有命令行工具和MongoDB Management Service(MMS),用于远程管理和监控MongoDB...
总结,MongoDB 2.8.0 是一个在 CentOS 上经过验证的稳定版本,它提供了查询性能的提升、聚合框架的强化以及更好的错误报告。如果你正在使用或计划使用 MongoDB,这个版本的更新是值得考虑的,特别是对于需要在 ...
10. 性能优化:根据你的具体需求,可以调整MongoDB的性能设置,如内存使用、索引策略和复制集配置。 MongoDB 7.0.0版本可能引入了新的特性、改进和修复,因此在升级前,建议阅读官方文档,了解新版本的详细信息和...
7. 分片可视化:在分布式环境中,分片是提高MongoDB性能的重要手段。Compass展示了分片集群的状态,帮助管理员监控和管理数据分布。 8. 安全性:Compass支持身份验证和角色管理,确保只有授权用户才能访问特定的...