如何解读MongoDB索引监控中的"accesses.ops"指标_识别热点索引频率

老杰君_3673

老杰君_3673

2026-04-23

1048人浏览

原创

accesses.ops是mongodb 5.0+中$indexstats返回的索引实际使用次数计数器,统计索引被真正用于查找/排序/范围扫描的次数,而非被选中或查询总次数。

如何解读mongodb索引监控中的\

accesses.ops 是什么,不是什么

accesses.ops 是 MongoDB 5.0+ 在 $indexStats 聚合阶段返回的一个计数器,表示该索引自上次重置以来被查询实际“用到”的次数(即命中索引执行了查找/排序/范围扫描等操作),不是被“选中”或“考虑过”的次数,更不是查询总次数。它只统计真正驱动了执行计划的索引访问行为。

  • 常见错误现象:看到某个索引 accesses.ops 为 0,就立刻删掉——可能它只在低峰期、报表任务或异常路径中被用到,监控窗口太短导致漏采
  • 使用场景:适合做周级/月级索引健康度巡检,配合 totalIndexSize 判断“高成本低使用”索引
  • 性能影响:该指标本身无开销,但频繁调用 $indexStats 聚合(尤其在大集合上)会轻微增加读压力

怎么查,查完怎么看

执行 db.collection.aggregate([{$indexStats: {}}, {$sort: {"accesses.ops": -1}}]) 即可获取当前集合所有索引的访问统计。重点关注三类值:

  • accesses.ops === 0:索引长期未被使用,但需确认是否处于冷备逻辑、灰度开关未开、或仅用于唯一约束校验(后者仍会触发索引访问)
  • accesses.ops 极高但 accesses.ops / totalDocsExamined 比值偏低:说明索引虽被高频调用,但过滤效果差(例如在低基数字段如 status: "active" 上建索引),可能拖慢整体查询
  • 同一字段组合有多个索引(如 {a:1} 和 {a:1,b:1}),但 {a:1} 的 accesses.ops 远高于 {a:1,b:1}:大概率是查询没带 b 条件,复合索引未被覆盖,此时可考虑收敛索引

为什么不能只看 accesses.ops 做决策

accesses.ops 是个“结果型”指标,不反映索引质量或查询效率。一个索引可能被调用 10 万次,但每次都要扫描 5000 文档;另一个只调用 100 次,却每次都精准定位 1 条——前者 accesses.ops 更高,但实际更该优化或替换。

Teleport tsh SSH (Identity-First SSH Access, no passwords/static keys)
Teleport tsh SSH (Identity-First SSH Access, no passwords/static keys)

使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。

下载
  • 必须结合 executionStats.nReturned 和 executionStats.totalDocsExamined(通过 .explain("executionStats") 获取)交叉验证
  • TTL 索引、哈希索引、文本索引的 accesses.ops 行为不同:TTL 索引主要被后台线程扫描,accesses.ops 可能持续增长但和业务查询无关;哈希索引在等值查询时才计数,范围查询直接不走索引也不计数
  • 分片集群中,$indexStats 返回的是本 shard 的数据,不是全局汇总,需在每个分片分别执行

实操建议:建立索引访问基线

别依赖单次快照。真实环境里,应该每周固定时间跑一次 $indexStats,把 accesses.ops 写入监控表,画趋势图。重点盯住“突降”和“长期归零”两类信号。

  • 突降:比如某索引上周是 2 万,这周变 200,要立刻查变更日志——是不是应用改了查询条件?ORM 自动生成语句变了?
  • 长期归零(连续 4 周):先用 db.collection.find({xxx}).explain() 手动验证该查询是否真没走索引;再检查是否用了 $or、$regex、或字段类型不匹配(如字符串查数字)导致索引失效
  • 别忘了隐藏索引:db.collection.hideIndex("idx_name") 后,accesses.ops 会停止增长,但索引仍在磁盘上——这是安全验证索引可删性的标准做法

真正的难点不在看懂数字,而在于把 accesses.ops 和你的业务请求链路对上号。比如订单服务的“查用户最近 3 笔订单”接口,对应哪个索引、预期多少 ops、波动容忍范围是多少——这些得靠你填,监控工具不会替你猜。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3149

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2308

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1240

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1198

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1356

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2138

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3440

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

15615

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程