← 中文资源

简体中文版本

用 SQL 索引加速慢查询

用 EXPLAIN 诊断慢 SQL,并添加有针对性的索引,把扫描行数从数百万降到几十;涵盖 B-tree、复合排序和索引反而变慢的情况。

阅读英文原文

如何读 EXPLAIN

执行计划展示数据库检索数据的策略。最重要的节点类型:

  • Seq Scan:读取每一行,大表上很慢
  • Index Scan:用索引直接找到匹配行
  • Index Only Scan:最佳情况,所需列都在索引中,无需访问表
  • Sort:未利用预排序索引时开销很大

全表扫描示例

Seq Scan on orders  (cost=0.00..123456.78 rows=20 width=40)
  Filter: (customer_id = 12345 AND created_at > '2025-01-01')
  Rows Removed by Filter: 4980000
  Buffers: shared read=83334
Execution Time: 7892.341 ms

问题:读取 83,334 个磁盘页(约 500 万行),过滤后只剩 20 行。合适索引能把读取降到约 3–5 页。

选择复合索引

按等值列在前、范围列在后的顺序建立复合索引,例如 (customer_id, created_at)。这样既能过滤客户,又能扫描时间范围,并避免额外排序。

验证效果

预期结果:同一查询的 EXPLAIN (ANALYZE, BUFFERS) 从 Seq Scan 变为 Index Scan 或 Index Only Scan,读取页数和执行时间显著下降。在真实数据量上比较前后计划,并确认写入开销可接受;索引不是越多越好。