TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 780 subscribers
Post #1650 4
PostgreSQL INCLUDE 索引的真实用途

PostgreSQL 11 引入的 INCLUDE 子句常被说成是为了支持索引覆盖扫描(index‑only scan),但覆盖索引在 9.2 之前的版本已经可以通过把所有查询列放入键列实现。INCLUDE 的核心价值在于:它允许在索引中额外存放列而不让这些列参与 B‑tree 的键排序和导航,从而在唯一约束、更新成本以及上层树结构上带来优势。

使用 INCLUDE 可以在保持索引大小不变的情况下,将不需要参与排序的列作为纯粹的负载存储,避免它们出现在分支页的键元组里,减小内部页面占用。对唯一约束而言,只有键列才会影响唯一性检查,INCLUDE 列不会破坏已有的唯一索引定义。

此外,INCLUDE 列不需要对应的操作符类,因而可以包含没有定义比较运算符的类型;在仅更新这些列时,PostgreSQL 还能利用自底向上的索引删除优化,提升写入性能。唯一限制是表达式不能作为 INCLUDE 列,若需要覆盖 ORDER BY,则必须把相应列放入键列。

关键区别

- 键列:参与 B‑tree 导航,出现在所有层级的分支页。
- INCLUDE 列:仅作为叶子页的额外负载,不参与键比较。

性能影响
- 对于只读查询,二者都能实现索引覆盖扫描。
- INCLUDE 索引在上层树更小,可能降低缓存压力。
- 但包含非键列会关闭 B‑tree 去重,导致在某些情况下索引体积略增。


在实际使用时,若仅需避免表访问而不改变唯一约束或排序需求,INCLUDE 是更轻量的选择;若查询需要排序或唯一约束涉及该列,则仍需将其放入键列。

#开发者 #工具 #PostgreSQL #INCLUDE #Btree #索引 @开发者工具库频道号
@DevToolboxHub
More from @devtoolboxhub
  1. Sep 26, 2026五仓库架构踩坑:Gitlink 与双 CI Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs…
  2. Sep 26, 2026Xeno Core:TypeScript 后端架构框架 Node.js 复杂系统的架构选型往往决定代码的长期命运。开发者常在两条路之间纠结:要么依赖重度使用实验性装饰器和反射(如…
  3. Sep 25, 2026用 SLO 给 AI Agent 的行为定个预算 Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token…
  4. Sep 25, 2026Xcode 27.2 改用 JSON 项目格式 Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目…
  5. Sep 25, 2026PostgreSQL 的 max_prepared_transactions 该不该开 prepared transaction 是脱离会话独立存在的两阶段提交事务。执行 PREP…
  6. Sep 24, 2026RPI 实战:用 Claude Code 子代理拆分研发流程 一个约十几个产品的小团队(helpdesk、MES、邮件托管、高校 AI 助手)在 monorepo 里日常使用 Cl…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →