是的,索引数据进入WiredTiger缓存;所有索引页(root、internal、leaf)均以page为单位由WiredTiger统一缓存管理,不区分数据页与索引页,查询触发索引扫描即加载对应页至working_set。
是的,所有索引页(包括B-tree的root page、internal page和leaf page)都由WiredTiger缓存统一管理。WiredTiger不区分“数据页”和“索引页”,而是把整个B-tree结构按page为单位加载进缓存——只要查询触发了索引扫描,对应索引页就会被载入working_set。
这意味着:索引不是只存在磁盘或OS Page Cache里;它必须先被WiredTiger从磁盘读到自己的缓存中,才能参与查找。如果索引太大、缓存太小,频繁的索引页换入换出会直接拖慢查询响应。
wiredTigerCacheSizeGB配置值直接影响索引页驻留能力,不是越大越好,需结合工作集大小与系统内存总量权衡db.collection.stats()里的wiredTiger.cache.bytes currently in the cache可观察实际占用常见于索引膨胀场景:当为高基数字段建了大量单字段索引,或未删旧索引导致索引总数激增,WiredTiger缓存会被大量低频访问的索引页占据,挤出真正热的数据页和常用索引页。
WiredTiger用LRU-K算法淘汰页面,但K值固定(默认为3),对“偶发大范围索引扫描”无感知——一次explain("executionStats")带indexOnly: false的全索引扫描,可能瞬间刷掉一批活跃数据页。
db.serverStatus().wiredTiger.cache["pages evicted by application thread"]是否异常高db.collection.getIndexes()识别冗余索引,尤其注意createdCollectionAutomatically: true这类隐式创建的索引db.collection.createIndex(..., { background: true })仍会争抢缓存资源)两者不是互斥,而是协作:WiredTiger缓存管逻辑页(解压后、带事务版本的B-tree page),OS Page Cache管物理块(压缩后的原始文件块)。一次索引查找要经过两层:先从OS Page Cache读取压缩的索引块 → WiredTiger解压并解析成逻辑页 → 放入自己的缓存供后续复用。
所以即使wiredTigerCacheSizeGB设得很小,只要OS有足够空闲内存,索引文件的底层块仍可能留在Page Cache里,降低磁盘IO;但WiredTiger缓存不足时,每次都要重复解压、校验、构建逻辑页,CPU和延迟代价明显上升。
O_DIRECT),WiredTiger依赖它做底层块预读vm.swappiness=1比0更稳妥,避免OOM Killer误杀mongod进程/proc/meminfo中的PageTables值,过高说明页表开销大,可能与索引碎片有关不能只看explain()输出的indexOnly: true,那仅代表查询能走索引覆盖,不代表索引页当前就在WiredTiger缓存中。真正要看的是执行时的缓存行为。
最直接方式:在查询前后对比缓存状态变化。关键指标不是“用了索引”,而是“是否避免了从磁盘加载索引页”。
db.serverStatus().wiredTiger.cache["bytes read into cache"]
db.setProfilingLevel(2)抓慢查询,重点看executionStats.nReturned与executionStats.totalDocsExamined是否接近——若相差大但缓存加载量高,说明索引选择性差,缓存被无效页污染MIBR 与 Nongshim 拿下 EWC 季后赛最后两席
克里斯托弗·诺兰作品《致命魔术》将重返影院
TP-Link Deco 7 Pro BE10000 Wi-Fi 7 全屋 Mesh 系统 6.4 折优惠现享
《自由足球怀旧服》大乱斗模式开启:强势中场登场:S3赛季任务及奖励重磅更新!
网易冷兵器新作《诡影藏锋》实机首曝:女鬼魅惑,恐怖拉满
炉石传说: Escape from Violet Hold 今日上线——探索游戏背后的人生哲理