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)