请教个 MongoDB 首次“慢加载”问题
发布于 5 年前 作者 josenspire 4337 次浏览 来自 问答

背景:Node Server 下; MongoDB,版本是 4.0 v,有个集合有 1亿 条数据;现在只考虑查询问题;相关的索引也加上了; 描述:当然这不是真的是一个查询“慢加载”的问题。根据记录,查询该集合时,首次 查询很慢,根据记录大概是 60s 左右,然后在短时间内换查询条件什么都是返回很快的,根据记录大概在 5s 左右;我查询了一些资料,默认是 WiredTiger 存储引擎,而机器文件系统缓存内存应该是够用的;根据网友的描述:

MongoDB要把数据加载到内存中,首先要从磁盘上读取原始的文件,那么文件内容就会进入filesystem cache. 然后要把文件内容转换为WiredTiger可以直接使用的格式,即解压,解密,之后的内容才会进到internal cache。所以一定要说先后顺序的话,internal cache中的内容肯定来自filesystem cache,后者先加载。

问题:在不拆表的情况下,有什么好的办法能解决**首次“慢加载”**的问题 ? 补充:当然说到索引的问题是有点崩溃的,因为数据较大,暂时还没去优化,目前有7个索引,2个复合索引,4个单字段索引,1个多key索引,暂时没有想到优化的地方;表字段名也都是较为精简的。 这一块知识有点盲 - -! 敬请大家用力吐槽,非常感谢!

5 回复

先用explain看看你的执行计划

建议分片 或者 增量 一个数据载体有过亿数据 太费 cpu 和 内存

只有首次慢加载显然是因为 Mongo 把结果读到缓存了,这也是 Mongo 吃内存的原因。
使用 db.getCollection('tableName').find(condition).explain("executionStats") 查看执行计划就知道了,参考官方文档 Explain Result
另外只考虑查询问题意思是表很少更新吗?那应该可以考虑定时任务去读,然后把结果缓存起来这类的做法吧

@chenjiyong 确实有点费资源。尝试了一些办法感觉也没办法,现在准备分片了= =!

@rrbe 是的是我忽略了,是有写的操作的,太过执着“首次读”的太慢的问题了 - -!。。缓存有考虑过,但是就因为还有一定实时性所以暂时也没尝试到很好的处理。现在准备分片先

回到顶部