跳转至

PostgreSQL 索引选择与慢查询定位

慢查询定位优先从执行计划入手:是否全表扫描、估算行数是否偏差、是否发生了排序/回表/重复扫描。

1. EXPLAIN/ANALYZE

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 20;

关注点:

  • 行数估算与实际差距
  • 是否使用 Index Scan / Bitmap Index Scan
  • buffers 命中情况(shared hit/read)

2. 常见索引类型

  • B-Tree:等值/范围/排序(最常用)
  • GIN:数组、jsonb、全文检索
  • GiST:地理空间、相似匹配等

3. 常见踩坑

  • 条件选择性太差导致不走索引
  • 函数包裹列(如 lower(email))需要表达式索引
  • 统计信息过旧(ANALYZE)