为常见查询建立索引
为最常运行的查询添加索引:按用户、按日期和按外键查询,并使用 EXPLAIN 衡量影响。
为常见查询建立索引 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是索引?
索引是一种独立的磁盘数据结构,可以让数据库根据列值查找行,而不必扫描整张表。经典实现是 B 树。
索引以写入换取读取
每个索引都会让 INSERT/UPDATE/DELETE 稍微变慢(因为索引也必须更新)。不要添加不需要的索引。
主键自带索引
声明 PRIMARY KEY 会自动创建唯一的 B 树索引。UNIQUE 列也是如此。
为外键列建立索引
PostgreSQL 不会自动为 FK 的子表一侧建立索引。请始终添加索引——否则删除父行时会扫描所有子行:
CREATE INDEX comments_post_id_idx ON comments(post_id);
CREATE INDEX comments_author_id_idx ON comments(author_id);为 WHERE 中使用的列建立索引
如果您经常按 created_at 进行过滤,请为它建立索引:
CREATE INDEX posts_created_at_idx ON posts(created_at DESC);
-- Query benefits:
SELECT * FROM posts ORDER BY created_at DESC LIMIT 20;复合索引
对于多列过滤条件,复合索引可能比两个单列索引快得多:
CREATE INDEX posts_author_published_idx
ON posts(author_id, published_at DESC);
-- This query uses the index for both filter and sort:
SELECT * FROM posts
WHERE author_id = 42
ORDER BY published_at DESC LIMIT 10;左前缀规则
复合索引 (a, b, c) 可以服务于 WHERE a = ? 和 WHERE a = ? AND b = ?,但不能单独服务于 WHERE b = ?。顺序很重要。
部分索引
只为您查询的行建立索引:
-- Only published posts:
CREATE INDEX posts_published_idx
ON posts(published_at DESC)
WHERE published_at IS NOT NULL;
-- Smaller index, faster lookups for the common case.表达式索引
为列的函数结果建立索引:
CREATE INDEX users_email_lower_idx ON users(LOWER(email));
-- Query that uses it:
SELECT * FROM users WHERE LOWER(email) = LOWER($1);不要建立过多索引
经验法则:
- 为 PK 建立索引 ✓(自动完成)
- 为 UNIQUE 列建立索引 ✓(自动完成)
- 为 FK 列建立索引 ✓
- 为热门查询中用于 WHERE / JOIN / ORDER BY 的列建立索引
- 不要为选择性非常低的列建立索引(例如,取值各占 50% 的布尔列)
使用 EXPLAIN 进行度量
在添加索引前后,运行 EXPLAIN ANALYZE,以确认查询规划器正在使用该索引:
EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = 42 ORDER BY published_at DESC LIMIT 10;回顾
对于我们的博客:为 FK 建立索引(comments 上的 post_id、posts 和 comments 上的 author_id),并在 posts 上为 (author_id, published_at DESC) 建立索引,以支持“按用户查询最新文章”的查询。
快速检查
您添加了外键 orders.user_id REFERENCES users(id)。应该创建什么索引(如果需要)?
常见问题解答
「为常见查询建立索引」课时是免费的吗?
是的 — 「为常见查询建立索引」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「为常见查询建立索引」这节课中我会学到什么?
为最常运行的查询添加索引:按用户、按日期和按外键查询,并使用 EXPLAIN 衡量影响。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「为常见查询建立索引」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为博客建模:用户、帖子、评论
- 选择键与类型
- 为常见查询建立索引
- 使用测试数据填充数据库