node.js - MongoDB 在获取大量文档时性能下降
问题描述
所以我已经在这个问题上待了一个星期,但我无法解决它。对大量文档的查询太慢了。
我正在运行一个超级基本的查找查询,然后是 a .toArray()
,然后将其发送到我们的前端。
const orders = await db.collection('Orders').find({ organization: new ObjectId('5fa28c7ad882490116f8761e') }).toArray()
查询本身需要 25 毫秒,在下面的executionStats中可以看到,但在检索数据之前需要 4.5 秒。
几百个文档按预期工作,最多需要几百毫秒。但是超过 500 个文档它很快就会变慢,现在我在 4.5 秒内获取约 25k 个文档。这甚至不是最终的查询。我将在此之上运行几个步骤的聚合,但这似乎是主要问题,它不能与硬件相关。我尝试将数据库升级到 M60 而不是下面提到的 M30,几乎没有区别,而且对于我们公司的规模来说太贵了。
我能做些什么?MongoDB 是否只能返回几百个文档?
以下是一些统计数据:
- 数据库:托管在 MongoDB Atlas,服务器位于同一国家,集群大小 M30(8 GB RAM,100 GB 存储,2 个 vCPU,288 IOPS)。高达 10 GBit/s 的网络。
- 我的机器:64 GB 3600 MHz RAM,5950x CPU,970 EVO Plus M.2 SSD。150 MBit/s 网络。
- 收藏统计:
{
"ns" : "[db].Orders",
"size" : 207216190,
"count" : 467771,
"avgObjSize" : 442,
"storageSize" : 59006976,
"freeStorageSize" : 12288,
"capped" : false,
"wiredTiger" : {
"metadata" : {
"formatVersion" : 1
}
}
}
- 执行统计:
{
"executionSuccess": true,
"nReturned": 26385,
"executionTimeMillis": 25,
"totalKeysExamined": 26385,
"totalDocsExamined": 26385,
"executionStages": {
"stage": "FETCH",
"nReturned": 26385,
"executionTimeMillisEstimate": 3,
"works": 26386,
"advanced": 26385,
"needTime": 0,
"needYield": 0,
"saveState": 26,
"restoreState": 26,
"isEOF": 1,
"docsExamined": 26385,
"alreadyHasObj": 0,
"inputStage": {
"stage": "IXSCAN",
"nReturned": 26385,
"executionTimeMillisEstimate": 2,
"works": 26386,
"advanced": 26385,
"needTime": 0,
"needYield": 0,
"saveState": 26,
"restoreState": 26,
"isEOF": 1,
"keyPattern": {
"organization": 1,
"state.removed": 1
},
"indexName": "organization_1_state.removed_1",
"isMultiKey": false,
"multiKeyPaths": {
"organization": [],
"state.removed": []
},
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 2,
"direction": "forward",
"indexBounds": {
"organization": [
"[ObjectId('5fa28c7ad882490116f8761e'), ObjectId('5fa28c7ad882490116f8761e')]"
],
"state.removed": [
"[MinKey, MaxKey]"
]
},
"keysExamined": 26385,
"seeks": 1,
"dupsTested": 0,
"dupsDropped": 0
}
}
}
解决方案
推荐阅读
- python - 插入主键也是外键的表时出现 SQLAlchemy 错误
- cdap - 如何在 Wrangler 中使用自定义转换?
- javascript - 为什么我调用这些函数时结果不同?
- html - 在 MVC 视图中使用 Sections 和 Articles 而不是表有什么好处?
- wordpress - Wordpress 设置帖子中第一张图片的特色图片
- elasticsearch - 弹性docker 6图像启动问题
- javascript - 将带有对象的数组转换为数组
- r - 如何将具有许多计算的整个脚本应用于 data.frame 中的每一列
- spring - 使用spring的kafka集群之间的事务传输消息
- python - Modify all local links in html file