mcpField
D
db-index-hygiene

db-index-hygiene

github.com/hainrixz数据与数据库2171 次安装3 天前更新
代码仓库

关于 db-index-hygiene

db-index-hygiene 是用于数据库审计的技能,查找带来写入和存储开销的索引。它检查重复、前缀冗余及运行时未使用的索引,并谨慎提出删除建议。

主要功能

  1. 01检测完全重复的索引
  2. 02查找左前缀冗余
  3. 03检查运行时使用统计
  4. 04短周期结果标为方向性
  5. 05索引删除仅作建议

适用场景

  1. 01审查 DDL 中的重复索引
  2. 02检查 PostgreSQL 目录中的冗余
  3. 03按代表性周期评估索引扫描

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hainrixz/claude-db --skill db-index-hygiene

安装后在 Claude Code 中输入/db-index-hygiene确认已加载。

详细介绍

db-index-hygiene (M12)

M11 的反向操作:M11 添加缺失的索引,M12 删除只带来开销的索引。每个索引都会拖慢写入、占用存储和缓存;重复索引和从未读取的索引纯属额外开销。影响 性能与扩展性 评分(轴 performance,关系型 索引卫生 w16)。

检查内容

  1. 完全重复 — 两个索引的键列列表(以及类型/谓词)完全相同;其中一个是冗余的。
  2. 冗余前缀 — 现有 (a, b) 索引已完全覆盖 (a) 索引;通常可以删除较短的索引(B-tree 最左前缀规则)。
  3. 未使用 — 在有代表性的时间窗口内没有扫描记录的索引(Tier-2 idx_scan = 0)。这是运行时事实:不能仅凭静态分析就断定索引未使用。

评分/轴

仅影响 performance(关系型 索引卫生 w16;在 NoSQL 配置中并入 索引)。

Tier-0(静态)

仅根据 DDL 解析已声明的索引,并检测完全重复和最左前缀冗余(重复项的置信度为 established — 完全基于结构)。未使用索引检测仅限运行时;在 Tier-0 会发出 status: needs_api(绝不会静默通过),并提示升级到 Tier-2。

Tier-1/2(验证查询,Postgres)

重复/冗余(Tier-1 目录):

SELECT indrelid::regclass AS tbl, array_agg(indexrelid::regclass) AS dupes
FROM pg_index GROUP BY indrelid, indkey, indclass, indpred
HAVING count(*) > 1;

未使用(Tier-2,需要持续收集统计信息):

SELECT relname AS tbl, indexrelname AS idx, idx_scan, pg_size_pretty(pg_relation_size(indexrelid)) AS sz
FROM pg_stat_user_indexes WHERE idx_scan = 0 ORDER BY pg_relation_size(indexrelid) DESC;

方法 index_check / query_stat。Tier-2 结果会将 M12.*.unused 确认为 established;没有有代表性的时间窗口时,仍为 directional;如果需要统计信息才能判断,则为 needs_api。

发现项

按 schema/finding.schema.json 发出发现项。示例:

  • M12.users.duplicate_email_index — 两个索引使用相同的键(severity:2、warn、轴 performance、基于 DDL 的置信度为 established、fixable: proposed — DROP INDEX)。
  • M12.orders.redundant_prefix_index — (status) 被 (status, created_at) 覆盖(severity:1、warn、established/directional、fixable: proposed)。
  • M12.events.unused_index — 时间窗口内扫描次数为零(severity:2、warn、Tier-2 为 established/Tier-0 为 needs_api、fixable: proposed)。

每个发现项:evidence.observed 会逐字引用索引 DDL 或目录/统计信息行;verification.reproduce 是上方引用 $DATABASE_URL 的查询;expected_impact 按区间给出并标注置信度(不提供未注明背景的百分比)。

诚信原则

  • 短时间窗口内未使用的索引,可能会被月末/季度任务使用 — 始终要求采用有代表性的时间窗口,并将短窗口的结论标记为 directional,而非 established。
  • 即使某个唯一索引/约束支撑索引“未用于”扫描,也不可删除 — 它负责维护完整性;绝不要建议删除。
  • 删除操作标记为 proposed(绝不标记为 auto):大规模删除无法轻易撤销,而且索引可能是有意保留的。请在修复预览中建议使用 DROP INDEX CONCURRENTLY。

评论

支持 Markdown