基于$indexStats 构建mongodb 所有集合的索引监控程序

news/2024/5/19 0:30:58 标签: mongodb, 数据库, inverted-index, database, prometheus

使用mongodb时,为集合中经常查询的字段添加索引,能够提高查询效率,减少扫描数据次数,限制扫描数据量,减少排序时间和内存与CPU的消耗。但索引的更新会为数据的添加和更新带来额外的消耗。因此,需要定期检查索引的使用情况,删除无效索引。

本文基于$indexStats 和 $merge命令,简单实现了一个收集mongodb 所有集合索引使用统计信息的方法,方便查询mongodb 索引使用统计信息。

  • 使用 db.getCollectionNames()获取当前数据库的集合名称列表。

        db.getCollectionNames() 返回当前数据库中所有集合和视图的名称数组。如果数据库开启了登录验证,返回用户有权限查看的集合和视图名称列表。

  • 通过$indexStats命令,查看集合统计信息。

$indexStats返回当前集合的索引统计信息。包括建立索引的字段,索引所在的主机名和端口,索引命中信息,分片名称,索引详细信息和索引当前的构建情况等。

  • 在aggregation 的最后一步,添加$merge,集中查询结果到数据表。

$merge命令,用于aggregation pipeline的最后一步,将pipeline前面查询结果输出到一个集合。$merge命令, 必须位于pipeline的最后一步。该命令,支持将查询结果输出到当前数据库,或者其他数据库。当输出的集合不存在时, $merge命令会自动创建数据集。通过指定数据合成的字段和方法, $merge 命令可以更新目标集合中具有相同字段数据,或覆盖已有的数据。

  • 查询集中后的索引统计数据集,获取无效索引信息。

按照上面4个描述的步骤,实现mongodb数据库索引使用统计信息和查询

//查询当前数据库的集合名称列表
let collNameArray = db.getCollectionNames()

//就查询出的集合列表循环,查询出每个集合中索引统计信息
collNameArray.forEach((collName)=>{
    db.getCollection(collName)
    .aggregate([{
        $indexStats: {}
    }, {
        $addFields: {
            "_id" : {
                "coll_name": collName,
                "idx_name": "$name"
            }
        }
    }, {$merge: { into: {coll: "coll_index_stats" }, on: "_id",  whenMatched: "replace", whenNotMatched: "insert" }}])//将查询出的集合索引统计信息放入集合coll_index_stats.
})
//按照索引命中次数的倒序,查看索引列表
db.coll_index_stats.find().sort('-accesses.ops')

基于上面的程序,还可以添加定时器实现索引统计信息的定时收集。也可以使用现代化的前端技术,做一个更友好的页面,实时查看索引信息。


http://www.niftyadmin.cn/n/5164861.html

相关文章

MySQL -- 事务管理

MySQL – 事务管理 文章目录 MySQL -- 事务管理一、理解事务1.如果CURD不加控制,会有什么问题2.事务的概念 二、MySQL中的事务1.事务的版本支持2.事务提交方式3.事务常见操作方式3.1.事务的开始与回滚3.2.证明未commit,客户端崩溃,MySQL自动会…

手机也能搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

快速排序【2023年最新】

快速排序思想总结: 内附快排模版,可开袋即食。 学了一套快速排序的模版,接下来我说一下我的理解。 这套模板的思路是这样的,随机找到一个点,可以是数组中的左边界也可以是右边界,或者是数组中任何一个元…

Ansible优化大全

文章目录 一、关闭系统信息收集二、开启加速 Ansible 执行速度修改配置文件/etc/ansible/ansible.cfg由于该功能与sudo冲突,必须关闭 requiretty 选项方法一方法二 参考文章: https://blog.csdn.net/o0o0o0D/article/details/110998873 一、关闭系统信息…

家用AIO系统架构图(Openwrt 群晖 IPV6 DDNS)

折腾几个月了,摸索出的最合适的系统架构。其余的系统架构也都行得通,但是从逻辑角度,下列方案更加的自然通顺。 系统架构图 疑问解答 为什么用IPV6? 2222年了都不会真有人能从运营商哪里搞到ipv4或者还没有ipv6吧。 光猫为什么桥接? 抠门运…

链表OJ——环形链表初阶与进阶

呀哈喽,我是结衣。 环形链表1 描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数…

Python进行多线程爬取数据通用模板

首先,我们需要导入所需的库,包括requests和BeautifulSoup。requests库用于发送HTTP请求,BeautifulSoup库用于解析HTML文档。 import requests from bs4 import BeautifulSoup然后,我们需要定义一个函数来发送HTTP请求并返回响应。…

Linux篇---第二篇

系列文章目录 文章目录 系列文章目录一、列举几个常用的Linux命令二、你平时是怎么查看日志的?一、列举几个常用的Linux命令 列出文件列表:ls【参数 -a -l】 创建目录和移除目录:mkdir rmdir 用于显示文件后几行内容:tail,例如: tail -n 1000:显示最后1000行 打包:tar…