Skip to content

pt-mongodb-index-check

对 MongoDB 的索引执行检查,找出重复索引和未使用的索引。

语法

bash
pt-mongodb-index-check <command> [flags]

用法示例

以下命令假定 MongoDB 已通过本机默认 URI(mongodb://localhost:27017)可达;需指定远程连接时用 --mongodb.uri= 提供连接串(命令里不要写明文密码,凭据从配置或密钥管理获取)。命令可直接复制,替换其中的库名与集合名即可。

场景:全库检查重复索引

例行巡检时扫一遍所有业务库,找出可作为其他索引前缀、应当删除的冗余索引:

bash
pt-mongodb-index-check check-duplicated --all-databases

场景:只查某库的未用索引

只关心某个业务库,统计 $indexstatsaccesses.ops = 0 的索引,避免维护无用索引拖慢写入:

bash
pt-mongodb-index-check check-unused --databases=appdb --all-collections

场景:只查指定集合

针对 orderscustomers 两张表做全部检查,聚焦排查范围:

bash
pt-mongodb-index-check check-all --databases=appdb --collections=orders,customers

场景:远程实例检查

连接远程 MongoDB 做重复索引检查,URI 只带用户、密码由配置或交互提供:

bash
pt-mongodb-index-check check-duplicated --all-databases --mongodb.uri=mongodb://user@10.0.0.1:27017

场景:JSON 输出便于脚本处理

把检查结果导出成 JSON,方便接入监控或工单系统做趋势分析:

bash
pt-mongodb-index-check check-all --all-databases --json

功能说明

检查重复索引

检查作为其他索引前缀的索引。例如有如下两个索引:

javascript
db.getSiblingDB("testdb").test_col.createIndex({"f1": 1, "f2": -1, "f3": 1, "f4": 1}, {"name": "idx_01"});
db.getSiblingDB("testdb").test_col.createIndex({"f1": 1, "f2": -1, "f3": 1}, {"name": "idx_02"});

由于 idx_02 的键与顺序与 idx_01 的前缀完全相同,因此 idx_02 可以被删除。

检查未使用的索引

获取所有索引的 $indexstats,报告其中 accesses.ops = 0 的索引。

命令

命令说明
check-duplicated检查重复索引
check-unused检查未使用的索引
check-all运行全部检查

选项

选项说明
--all-databases检查所有数据库(不含系统库)
--databases=DATABASES,...要检查的数据库列表(逗号分隔)
--all-collections检查所选数据库中的所有集合
--collections=COLLECTIONS,...要检查的集合列表(逗号分隔)
--mongodb.uri=连接 URI
--json以 JSON 格式输出
--version显示版本信息

其他信息

  • 作者:Carlos Salguero

  • 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明

更多细节请阅读 官方文档

Percona Toolkit 中文文档 · 社区维护的第三方学习站