`

MongoDB查询性能验证及优化

阅读更多
结论:
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
0
0
分享到:
评论

相关推荐

    MongoDB查询性能优化验证及验证

    本篇文章将深入探讨MongoDB查询性能优化验证的相关知识,包括查询优化原则和实际测试案例。 首先,理解MongoDB查询优化的基本原则至关重要。这包括: 1. **索引优化**:合理创建和使用索引能够显著提高查询速度。...

    mongodb管理工具

    MongoDB作为一个NoSQL数据库,它的管理工具对于数据库的日常维护、性能优化和问题排查至关重要。通过这些工具,用户能够更高效地处理数据,进行备份、恢复,监控数据库性能,并进行复杂的查询操作,从而提升开发和...

    mongodb开发精要 书籍 两本PDF

    索引是提升查询性能的关键,MongoDB支持多种类型的索引,如单字段索引、复合索引、文本索引、地理空间索引等。明智地创建和管理索引能显著提高查询速度。 六、复制集与分片 1. 复制集:为了确保数据的高可用性和...

    MongoDB The Definitive Guide 3rd Edition.pdf

    8. MongoDB的性能优化:MongoDB的性能优化包括索引优化、查询优化、数据压缩和缓存等技术。 MongoDB的性能优化可以提高查询性能和数据处理能力。 9. MongoDB的应用场景:MongoDB的应用场景包括大数据处理、实时数据...

    深入浅出MongoDB应用实战集群及系统架构

    ### MongoDB应用实战集群及系统架构 #### MongoDB简介 MongoDB是一种非常流行的开源文档数据库,它采用了NoSQL(非关系型数据库)技术,可以提供高性能、高可用性和易扩展性。MongoDB非常适合处理大规模数据和复杂...

    mongodb 3.4 手册

    对于MongoDB的性能评估和优化,手册提供了评估当前操作性能的方法,并指导用户如何优化查询和写入操作的性能。它还包括了如何分析查询性能和tailable cursors(一种特殊类型的游标)的内容。为了帮助用户更好地理解...

    mongodb-4.0.4_windows

    4. 连接MongoDB shell,验证安装是否成功,可以运行简单的查询和操作。 在使用MongoDB时,开发者和管理员还需要了解如何进行数据备份和恢复、设置复制集以实现高可用性,以及如何进行水平扩展以处理更大的负载。...

    收集的Mongodb资料

    5. 性能优化:提供提高MongoDB性能的策略,如索引创建、查询优化和存储引擎选择。 6. 复制集与分片:阐述复制集的原理和配置,以及如何进行水平扩展使用分片技术。 7. 聚合框架:介绍聚合管道,用于处理数据流和进行...

    Studio 3T for Mongodb

    4. **性能分析**:内置的性能监控工具可以帮助用户分析MongoDB服务器的运行状态,包括CPU使用率、内存消耗和I/O性能等,以便优化数据库性能。 5. **安全性**: Studio 3T 支持身份验证和权限管理,可以创建、编辑和...

    mongodb.zip

    10. **监控与管理工具**: MongoDB提供了一个名为MongoDB Compass的图形用户界面,方便用户进行数据浏览、查询优化和性能监控。此外,还有命令行工具和MongoDB Management Service(MMS),用于远程管理和监控MongoDB...

    mongodb2.8.0

    总结,MongoDB 2.8.0 是一个在 CentOS 上经过验证的稳定版本,它提供了查询性能的提升、聚合框架的强化以及更好的错误报告。如果你正在使用或计划使用 MongoDB,这个版本的更新是值得考虑的,特别是对于需要在 ...

    mongodb7.0.0安装包

    10. 性能优化:根据你的具体需求,可以调整MongoDB的性能设置,如内存使用、索引策略和复制集配置。 MongoDB 7.0.0版本可能引入了新的特性、改进和修复,因此在升级前,建议阅读官方文档,了解新版本的详细信息和...

    mongodb4.4.6安装包

    2. **存储引擎优化**:此版本可能进一步优化了默认的WiredTiger存储引擎,提供更好的读写性能和空间利用率。 3. **安全增强**:MongoDB持续加强安全特性,4.4.6可能包含了安全漏洞的修复和认证授权机制的强化。 4. *...

    liunux centos系统mongodb3.2.0的压缩包

    MongoDB 3.2 包含了许多性能优化,包括更快的查询执行、更高效的内存管理和写操作。可以通过调整参数如 `wiredTigerCacheSizeGB`、`journalCompressor` 和 `storageEngine` 来优化性能。 9. 监控与日志: MongoDB...

    demo-mongodb.zip

    7. **性能优化**:MongoDB允许索引创建,通过索引可以显著提升查询性能。此外,内存映射文件(MMAPv1)和自定义的存储引擎如WiredTiger,都为MongoDB提供了优秀的性能。 8. **驱动程序支持**:MongoDB提供了多种...

    mongodb-compass-1.17.0-win32-x64 MongoDB可视化工具Compass

    7. 分片可视化:在分布式环境中,分片是提高MongoDB性能的重要手段。Compass展示了分片集群的状态,帮助管理员监控和管理数据分布。 8. 安全性:Compass支持身份验证和角色管理,确保只有授权用户才能访问特定的...

Global site tag (gtag.js) - Google Analytics