~/VibeHandbook
免费 PDF

14 · 05

索引

一个**索引(index)**就像一本书后面的索引:它让数据库直接跳到匹配的行,而不必扫描每一行。没有索引,查询会随着数据增长而变慢——在 100 行时还好,在 1,000,000 行时就痛苦了。

没有索引,数据库会逐行依次检查;有了索引,它就直接跳到匹配项——就像书的索引把你送到正确的页码,而不必从头读到尾:

  NO INDEX  (Seq Scan)              WITH INDEX  (Index Scan)
  逐行读取每一 row                  直接跳到匹配项
  ┌─────────────────────┐          ┌─────────────┐
  │ row 1   ✗           │          │   INDEX     │
  │ row 2   ✗           │          │ author_id   │
  │ row 3   ✓  匹配      │  ◀──────┐ │   ──┬──     │
  │ row 4   ✗           │         │ └─────┼───────┘
  │ ...     (1,000,000) │         │       ▼
  │ row N   ✓  匹配      │         └──▶ rows 3, 998   ✓
  └─────────────────────┘          只需几跳,而非百万次

实用的指导:

  • 为你频繁筛选连接的列建立索引(例如 author_idemail)。
  • 主键会自动建立索引。
  • 不要给所有东西都建索引——每个索引都会加速读取,但会拖慢写入并占用空间。
  • 当你看到一个慢查询时再添加索引,而不是预先给每一列都加。

弄清楚某个索引到底有没有用的诚实办法,是去问数据库,而不是去猜。每个 引擎都有 EXPLAIN(在 Postgres 里是 EXPLAIN ANALYZE),它会展示它将采用的计划:

EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = '...';

如果在一张大表上输出说 Seq Scan,那就是数据库在读取每一行——一个索引会有帮助的信号。加上一个之后,它应该切换为 Index Scan。这是一个很适合交给 AI 的任务:把慢查询和 EXPLAIN 的输出贴上去,问该加哪个索引以及为什么。你通过理解答案来保持掌控,而不是靠背索引理论。

想离线阅读?

免费下载整本书的 PDF 或 EPUB。