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

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

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

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

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

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

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

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

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

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

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

javascript 复制代码
//查询当前数据库的集合名称列表
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')

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

相关推荐
tatasix32 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言3 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...3 小时前
索引(MySQL)
数据库·mysql·索引