如何读 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,读取页数和执行时间显著下降。在真实数据量上比较前后计划,并确认写入开销可接受;索引不是越多越好。