关于 db-index-hygiene
db-index-hygiene 是用于数据库审计的技能,查找带来写入和存储开销的索引。它检查重复、前缀冗余及运行时未使用的索引,并谨慎提出删除建议。
主要功能
- 01检测完全重复的索引
- 02查找左前缀冗余
- 03检查运行时使用统计
- 04短周期结果标为方向性
- 05索引删除仅作建议
适用场景
- 01审查 DDL 中的重复索引
- 02检查 PostgreSQL 目录中的冗余
- 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)。
检查内容
- 完全重复 — 两个索引的键列列表(以及类型/谓词)完全相同;其中一个是冗余的。
- 冗余前缀 — 现有
(a, b)索引已完全覆盖(a)索引;通常可以删除较短的索引(B-tree 最左前缀规则)。 - 未使用 — 在有代表性的时间窗口内没有扫描记录的索引(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。