MongoDB Atlas查询首次执行缓慢、后续大幅提速的原因咨询
问题原因分析
索引缓存未预热:MongoDB首次处理新过滤条件的查询时,对应索引的核心数据块还没加载到WiredTiger的内存缓存里。前几次执行得从磁盘读数据,磁盘IO速度比内存慢好几个数量级,自然耗时久。等索引数据被缓存到内存后,后续查询直接从内存取数,速度就降到1-2秒了。你这集合有10个索引,新过滤条件对应的索引大概率之前没被用过,所以得先完成加载。
查询计划还没定型:MongoDB的查询优化器碰到新查询时,会先评估不同的执行路径——比如要不要用索引、用哪个索引性价比最高。前几次执行的时间里包含了优化器做评估的开销,等最优执行计划被缓存下来,后续查询直接复用这个计划,不用再做路径评估,速度自然提上来。
WiredTiger数据页缓存:WiredTiger会把频繁访问的数据页存在内存缓存里。首次查新过滤条件时,得从磁盘拉取对应的数据页,之后这些页被缓存,后续查询直接读内存,IO开销大幅降低,速度就快了。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

