Spring Boot集成MongoDB执行findAll查询耗时突增问题求助
MongoDB findAll()性能骤降排查与解决
问题背景
MongoDB集合约4000条记录(总大小3MB),近期调用findAll()接口耗时从3秒飙升至30秒。日志显示:首批101条数据通过find命令仅耗时800ms,但后续3000+条数据通过getMore命令获取耗时约25秒。
先确认MongoDB服务端是否有变更
- 检查集群配置变更:分片拓扑调整、副本集成员变更、读写节点切换情况
- 核对MongoDB版本:是否有版本升级操作,新版本可能引入性能特性或问题
- 查看资源配额变化:云服务实例的CPU、内存、带宽是否被调整(如降级)
- 排查近期运维操作:是否有索引删除、集合迁移、备份任务执行等行为
非服务端变更的解决方向
1. 调整游标批次大小
默认游标批次较小,可通过增大batchSize减少getMore调用次数,一次性获取更多数据:
Mongo Shell命令:
db.store_info.find().batchSize(2000)
Java驱动代码:
mongoCollection.find().batchSize(2000)
2. 分析查询执行计划
执行以下命令查看查询的执行细节,确认是否存在执行计划退化:
db.store_info.find().explain("executionStats")
重点检查是否走了预期的索引,或全表扫描阶段是否有异常耗时。
3. 排查客户端与服务端网络链路
测试客户端到MongoDB节点的网络稳定性,包括带宽占用、丢包率等。可通过ping、traceroute工具验证,或查看MongoDB控制台的网络监控指标。
4. 升级客户端驱动版本
过旧的驱动可能存在游标处理的性能bug,尝试升级到与MongoDB服务端版本兼容的最新驱动。
5. 清理集合碎片
若集合频繁进行增删改操作,可能产生数据碎片导致全表扫描变慢:
- 重建索引(低峰期执行):
db.store_info.reIndex()
- 压缩集合(锁表操作,需业务低峰期执行):
db.runCommand({ compact: "store_info" })
6. 检查服务端资源负载
登录MongoDB控制台查看核心资源使用率:
- CPU高负载:排查是否有其他慢查询占用资源,分析慢查询日志
- 内存不足:是否因内存不够导致频繁换页,需调整实例内存配置
- 磁盘IO过高:磁盘性能瓶颈,考虑升级磁盘类型(如HDD换SSD)
附相关日志
2024-06-25 23:12:28.282 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.protocol.command : Command "find" started on database xxxxxx(myDB) using a connection with driver-generated ID 7 and server-generated ID 359278 to ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017. The request ID is 126. Command: {"find": "store_info", "filter": {}, "$db": "(myDB)", "$clusterTime": {"clusterTime": {"$timestamp": {"t": 1719371540, "i": 17}}, "signature": {"hash": {"$binary": {"base64": "seWJAmzUG+s7FNRGd8quBA56qiU=", "subType": "00"}}, "keyId": 7329958630948601874}}, "lsid": {"id": {"$binary": {"base64": "DOjrGyGyTxGodObhFX8SBw==", "subType": "04"}}}} 2024-06-25 23:12:29.130 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.protocol.command : Command "find" succeeded in 844.27 ms using a connection with driver-generated ID 7 and server-generated ID 359278 to ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017. The request ID is 126. Command reply: {"cursor": {"firstBatch": [...(my data here)] 2024-06-25 23:12:29.131 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.operation : Received batch of 101 documents with cursorId 3203780083378422937 from server ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017 2024-06-25 23:12:29.144 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.protocol.command : Command "getMore" started on database TPSI_PROD using a connection with driver-generated ID 7 and server-generated ID 359278 to ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017. The request ID is 127. Command: {"getMore": 3203780083378422937, "collection": "store_info", "$db": "(MYDB)", "$clusterTime": {"clusterTime": {"$timestamp": {"t": 1719371548, "i": 9}}, "signature": {"hash": {"$binary": {"base64": "a6bHBg5M4fkAfg3nUqNCely4w64=", "subType": "00"}}, "keyId": 7329958630948601874}}, "lsid": {"id": {"$binary": {"base64": "DOjrGyGyTxGodObhFX8SBw==", "subType": "04"}}}} 2024-06-25 23:12:55.562 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.protocol.command : Command "getMore" succeeded in 26352.68 ms using a connection with driver-generated ID 7 and server-generated ID 359278 to ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017. The request ID is 127. Command reply: {"cursor": {"nextBatch": [...(rest of my data)] 2024-06-25 23:12:55.598 DEBUG 92737 --- [nio-8080-exec-5] org.mongodb.driver.operation : Received batch of 3608 documents with cursorId 0 from server ac-ktqn9ck-shard-00-02.dxlowxv.mongodb.net:27017
内容的提问来源于stack exchange,提问作者Sen Cai
相关产品推荐
相关产品推荐

