← 中文资源

简体中文版本

不停机创建数据库索引

并发构建索引,检测无效构建,观察复制延迟,避免在大表上锁住写入。

阅读英文原文

证明索引确有必要

索引会消耗写入吞吐和存储。从一个具体查询、实测执行计划和基线延迟开始。如果查询只扫描少量行或已经很快,索引只增加成本。先在预发副本上创建,估算耗时和锁行为。

CREATE INDEX CONCURRENTLY idx_orders_customer_created
ON orders (customer_id, created_at DESC);

CONCURRENTLY 避免阻塞写入,但耗时更长,且不能在事务内运行。失败可能留下无效索引;检查 pg_index.indisvalid,删除后重试。

观察副本与锁

构建会读表并生成 WAL,可能延迟副本。构建期间监控复制延迟和查询延迟。使用 lock timeout,在 DDL 无法获取短暂锁时快速失败,而不是排队在长事务后。

验证并决定

前后运行 EXPLAIN (ANALYZE, BUFFERS),确认规划器使用索引且目标查询改善。检查写入延迟没有回退。如果索引未被使用或改善可忽略,就删除它;无用索引只是额外开销。