Skip to content

从 0 到 1 学习 PostgreSQL

一套面向零基础、覆盖底层原理与面试高频考点的中文 PostgreSQL 系统教程——看完会用、用了懂原理、面试能答上。

✨ 教程亮点

  • 📚 19 章正文:从 psql 入门到 MVCC、WAL、流复制、pgvector,由浅入深一气呵成
  • 📄 150+ 文件:每章 .md 学习文档 + demo.html 可视化演示 + code/*.py 真实可跑脚本 + init.sql 一键建表
  • 🎮 19 个交互演示页:纯 HTML/JS,零依赖,浏览器双击即开,点一下看一步
  • 💼 19 套面试高频题:每章 5+ 题,难度分级(⭐~⭐⭐⭐⭐),直接对标大厂一面真题
  • 🛠 真实可跑代码:100% 用 psycopg v3 写的 Python 脚本,复制即用,不留伪代码
  • 🐘 生活化类比:MVCC ≈「图书馆借书卡」、WAL ≈「写日记本」、Checkpoint ≈「攒一摞日记一次抄正本」
  • 🥊 横向对比 MySQL:每章带「📌 与 MySQL 的区别」小框,已会 MySQL 的同学加速学习
  • 📦 一键开发环境:根目录 docker-compose.yml 已带 pgvector + pg_stat_statements + 调优参数

🚀 快速开始(3 步上手)

第 1 步:起一个 PostgreSQL 实例

方式 A:用本目录提供的 docker-compose(强烈推荐) —— 已经预装 pgvector,并提前打开 pg_stat_statements,可直接跑前 18 章的所有代码。

bash
cd /path/to/learnNote/postgre
docker compose up -d
docker compose logs -f pg     # 看到 "database system is ready" 就 OK

方式 B:本地已经有 PG 16/17 —— 只要满足以下条件即可:

bash
# 1) 数据库与账号
psql -h 127.0.0.1 -U postgres -c "CREATE DATABASE learn_pg;"

# 2) postgresql.conf 里建议加(避免章节里反复提示):
#    shared_preload_libraries = 'pg_stat_statements'
#    pg_stat_statements.track = 'all'
# 然后 systemctl restart postgresql 或 pg_ctl restart

⚠️ 如果你的 PG 没装 pgvector,第 18/19 章的向量检索 demo 会报 extension "vector" is not available,请改用方式 A 或自行 apt-get install postgresql-16-pgvector

第 2 步:装 Python 依赖

bash
python -m venv .venv
source .venv/bin/activate     # Windows: .venv\Scripts\activate
pip install -r requirements.txt

第 3 步:跑第一个 demo

bash
# 进入第 2 章,先建一份示例库
psql -h 127.0.0.1 -U postgres -d learn_pg -f 02_psql_basic/init.sql

# 跑第一段 Python 演示
python 02_psql_basic/code/basic_query.py

# 双击打开第 2 章的演示页(纯前端,零依赖)
# Linux:  xdg-open 02_psql_basic/demo.html
# macOS:  open     02_psql_basic/demo.html
# Win:    start    02_psql_basic\demo.html

看到列出的表数据 + 浏览器里的 psql 元命令演示页,就算环境跑通啦 🎉。


📂 目录结构总览

learnNote/postgre/
├── README.md                  ← 你正在看的这份门面
├── docker-compose.yml         ← 一键起 PG 16 + pgvector + pg_stat_statements
├── requirements.txt           ← 前 18 章统一的 Python 依赖
├── .gitignore                 ← Python / 编辑器 / 数据卷忽略规则

├── task.md                    ← 教程总纲(产品定位 + 章节大纲)
├── 0_learn_plan.md            ← 11 周学习路线图(含每周练习任务)
├── interview.md               ← 19 章面试题总索引
├── appendix_pg_vs_mysql.md    ← 附录 A:PG vs MySQL 对比速查表
├── appendix_cheatsheet.md     ← 附录 B:PG 常用命令速查表
├── appendix_pitfalls.md       ← 附录 C:30 个真实踩坑案例集

├── 01_intro.md                ← 第 1 章正文
├── 01_intro/                  ← 第 1 章配套
│   ├── demo.html              ← 浏览器交互演示
│   └── code/*.py              ← 可运行 Python 代码

├── 02_psql_basic.md
├── 02_psql_basic/{demo.html, init.sql, code/}

├── ... 同样的结构重复 17 次(03 ~ 18)...

├── 19_project.md              ← 综合实战章节正文
└── 19_project/                ← 综合实战项目(自带 docker-compose / README)
    ├── README.md
    ├── docker-compose.yml     ← ⚠️ 与根目录 compose 端口冲突,二选一启
    ├── requirements.txt
    ├── init.sql
    ├── seed.sql
    └── code/{api.py, posts.py, search_*.py, ...}

💡 每章的代码 / SQL / demo 都自包含,可以从任意章节切入,不强制顺序。


🗺 学习路线(6 阶段 11 周)

学习路线完整版见 0_learn_plan.md,下表是速览:

阶段章节内容主题时长关键产物 / 学完能干嘛
一 · 入门启航Ch 1 ~ Ch 2PG 是什么 + psql 基础1 周玩转 \d \dt \df,会写 DDL/DML/RETURNING
二 · SQL 精通Ch 3 ~ Ch 5类型系统 + 高级查询2 周JSONB / 数组 / CTE / 窗口函数 / ON CONFLICT upsert
三 · 索引与事务Ch 6 ~ Ch 8索引选型 + 隔离级别 + MVCC2 周看懂 EXPLAIN ANALYZE、理解 SSI 与 HOT 更新
四 · 内核原理Ch 9 ~ Ch 11存储页 + WAL/Checkpoint + 锁2 周pageinspect 看页结构,能分析死锁
五 · 编程与运维Ch 12 ~ Ch 15PL/pgSQL + RLS + 备份恢复 + 流复制2 周写触发器、配 RLS、做 PITR、搭一主一从
六 · 扩展与实战Ch 16 ~ Ch 19分区 + 调优 + PostGIS/pgvector + 综合项目2 周做月分区、定位 Top N 慢 SQL、跑 RAG demo

只想达到「会用 + 能面试」可以跳过第六阶段的 PostGIS / TimescaleDB,8 周完成。


📖 每章速览

表格按 task.md 第六节大纲对齐,标题保持一致;点击列内链接直达。

#主题学习文档演示页代码目录关键难点
01PostgreSQL 是什么 & 为什么火01_intro.mddemocode/与 MySQL 定位差异 / 进程模型
02psql 与基础 SQL02_psql_basic.mddemocode/三级结构 / \d \dt \df / search_path
03数据类型详解03_data_types.mddemocode/JSONB 操作符 / 时区 / 数组 / 范围类型
04约束、视图与序列04_constraint_view.mddemocode/排他约束 EXCLUDE / 物化视图 / IDENTITY
05高级查询05_advanced_query.mddemocode/递归 CTE / 窗口函数 / LATERAL / upsert
06索引体系06_index.mddemocode/6 种索引选型 / 部分 / 表达式 / EXPLAIN 解读
07事务与隔离级别07_transaction.mddemocode/RC vs RR vs SSI / SAVEPOINT / 显式行锁
08MVCC 与 VACUUM08_mvcc_vacuum.mddemocode/xmin/xmax / HOT / 死元组 / XID 回卷
09存储与物理结构09_storage.mddemocode/页 / TOAST / FSM / VM / pageinspect
10WAL 与 Checkpoint10_wal_checkpoint.mddemocode/LSN / wal_level / 崩溃恢复 / full_page_writes
11锁机制11_lock.mddemocode/8 种表锁 / advisory lock / 死锁排查
12服务端编程12_server_programming.mddemocode/PL/pgSQL / 触发器 / LISTEN/NOTIFY
13权限与安全13_security.mddemocode/角色模型 / 行级安全 RLS / pg_hba.conf
14备份与恢复14_backup_recovery.mddemocode/pg_dump/pg_restore / pg_basebackup / PITR
15复制与高可用15_replication.mddemocode/流复制 / 同步模式 / 逻辑复制 / 故障切换
16分区与分库分表16_partition.mddemocode/RANGE/LIST/HASH 分区 / 分区裁剪 / FDW
17性能调优17_performance.mddemocode/pg_stat_statements / auto_explain / 关键参数
18常用扩展生态18_extension.mddemocode/PostGIS / pgvector / pg_cron / pg_trgm / unaccent
19综合实战项目19_project.mddemocode/博客全文检索 + 向量 RAG + 多租户 + 性能审计

📌 各章脚本统一连接:host=127.0.0.1 port=5432 dbname=learn_pg user=postgres,密码默认 postgres,连接信息通常以环境变量 PGHOST/PGUSER/PGDATABASE/PGPASSWORD 兜底。 📌 跨章节表名已加 chN_ 前缀(如 ch6_ordersch11_inventory),同库练习不会互相覆盖。


🧭 配套元文档

文件作用
task.md教程总纲与产品需求文档:定位、读者画像、章节产出标准(每章 4 件套)、写作执行顺序
0_learn_plan.md11 周学习路线图:6 阶段拆解 + 每阶段练习任务 + 推荐资源 + 时间预算
interview.md19 章面试题总索引:按章节 + 难度(⭐~⭐⭐⭐⭐)归类,跳冲刺复习神器
appendix_pg_vs_mysql.md附录 A:PG 16 vs MySQL 8.0 / InnoDB 全维度对比速查表
appendix_cheatsheet.md附录 B:psql 元命令 / 库表 / 角色 / 索引 / EXPLAIN 速查工具书
appendix_pitfalls.md附录 C:30 个真实踩坑案例(5 段式:现象→原因→复现→解决→预防)

🧰 环境要求

组件推荐版本说明
PostgreSQL16 / 1713 也大体兼容;涉及 SQL MERGE 的章节需 ≥15
Python3.10+3.9 也能跑,但少数类型注解会警告
psycopgv3.1+教程统一用 v3 接口,不要装 psycopg2
Docker / Compose24+ / v2仅在用根目录或 19 章 compose 时需要
psql 客户端与服务端同大版本想用增强版可装 pgcli
浏览器Chrome / Edge / Firefox 任意打开 demo.html 即可,无需 Web 服务器

🐳 不想装本地 PG? 直接 docker compose up -d 一行完事。 🪟 Windows 用户:建议在 WSL2 里跑;Native Windows 也能跑,shell 脚本(第 14/15 章)改用 PowerShell 等价命令即可。


❓ 常见问题 FAQ

Q1:CREATE EXTENSION xxxextension "xxx" is not available

A:扩展二进制没装。

  • 用根目录 docker-compose.yml 起的容器:pgvector / pg_stat_statements / pgcrypto / pg_trgm / btree_gin/gist / tablefunc / unaccent 等都自带;只有 PostGIS / pg_cron 不自带,参考 docker-compose.yml 文件底部的备选镜像注释。
  • 自己装的 PG:Debian/Ubuntu 装 postgresql-16-<扩展名>,比如 postgresql-16-pgvectorpostgresql-16-cronpostgresql-16-postgis-3;Mac 用 brew install <扩展>
  • 装好后重启 PG,再 CREATE EXTENSION IF NOT EXISTS xxx;

Q2:Python 脚本报 connection to server at "127.0.0.1", port 5432 failed: Connection refused

A:服务还没起,或者端口被防火墙挡了。

bash
# 自检三连
docker compose ps                            # 容器是否 healthy
psql -h 127.0.0.1 -U postgres -d learn_pg    # 命令行能否连
ss -lntp | grep 5432                         # 5432 端口是否在监听

如果你本地已有别的 PG 在用 5432,把根目录 docker-compose.yml5432:5432 改成 5433:5432,并相应设置 export PGPORT=5433 给脚本。

Q3:跨章节练习时,不同章节的表名 / 索引名是不是会打架?

A:教程已经主动避免:

  • 各章 init.sql 中的表名都加了 chN_ 前缀(如 ch6_ordersch11_inventory)。
  • 共用的「user / order / book」之类宽泛名字只出现在第 19 章综合项目,且第 19 章建议另开一个 DB / 容器(用 19_project/docker-compose.yml)。
  • 想彻底重置:docker compose down -v 把数据卷删掉重来,30 秒回到出厂设置。

Q4:不同 PG 版本,章节内容兼容吗?

A:教程目标版本是 PG 16,整体也覆盖 PG 13 ~ 17:

  • ⛔ 用到 MERGE 的示例需要 PG 15+(第 5 / 19 章会标注)。
  • ⛔ 用到 pg_basebackup --incremental、SQL/JSON 路径表达式的需要 PG 17(第 14 章会标注)。
  • ⚠️ gen_random_uuid() 在 PG 13 之前要先 CREATE EXTENSION pgcrypto;PG 13+ 内置。
  • ✅ 其余 SQL / 索引 / MVCC / WAL / 复制语义 PG 13~17 一致。

Q5:pgvector / PostGIS 装不上 / 镜像太大怎么办?

A:

  • pgvector:用 pgvector/pgvector:pg16 镜像(已经是默认),完全无痛。
  • PostGIS:镜像约 700MB,第 18 章 02 用得到。临时改 docker-compose.ymlimage: 行为 postgis/postgis:16-3.4 即可,详见文件底部备选注释。
  • 只是想看效果不想下镜像?每章的 demo.html 是纯前端模拟,无需后端也能看动画演示原理。

Q6:脚本里有些 EXPLAIN ANALYZE 数字和我跑出来不一样?

A:完全正常。EXPLAIN ANALYZE 的耗时和 buffer 命中受机器、缓存、统计信息影响——关注节点类型与相对量级,不要纠结绝对毫秒数。第 6 / 17 章会反复强调这一点。

Q7:第 14 章 PITR / 第 15 章流复制需要起两个实例,但根目录 compose 只起了一个?

A:是的,根目录 compose 只是「日常学习用的 1 实例」。

  • 第 14 章 PITR 演示用同一个实例的 pg_basebackup + archive_command 即可,无需第二实例。
  • 第 15 章流复制需要主从两个实例,章节里给了 02_setup_streaming_replication.sh,端口默认 5440 / 5441,错开根目录的 5432,可以同时启。

Q8:我能不能跳着学?

A:可以!但建议至少按下面顺序「踩点」:

Ch1 → Ch2 → Ch3 → Ch6 → Ch7 → Ch8
(搞定 SQL + 索引 + 事务 + MVCC,已是合格 PG 用户)
然后按兴趣挑:
  做 OLTP → Ch9/10/11/14/15/17
  做 AI/搜索 → Ch5/18/19
  做运维 → Ch13/14/15/17

🤝 如何贡献 / 反馈

  • 发现错别字、SQL 报错、脚本兼容性问题?欢迎直接 PR / Issue(在你接入的代码托管平台)。
  • 想新增「真实业务场景案例」「面试真题」「踩坑案例」?参考已有章节结构,保持「概念 → 类比 → 示例 → 原理 → 对比 MySQL → 小结」六段式即可。
  • 长期欢迎补充 PG 17 / 18 新特性云上托管 PG(RDS / AlloyDB / Aurora)专题TimescaleDB / Citus 进阶玩法

🙏 致谢与参考

本教程在结构、举例、面试题选型上参考了大量优秀资料,向社区致敬:

官方资料

推荐书籍

  • 《PostgreSQL 修炼之道》(第 2 版)— 唐成
  • 《PostgreSQL 技术内幕:查询优化深度探索》— 张树杰
  • 《The Internals of PostgreSQL》— Hironobu Suzuki(免费在线版
  • 《PostgreSQL 实战》— 谭峰、张文升

在线资源

工具


祝你早日成为团队里的 PG 专家!开始你的 0 → 1 之旅吧 → Ch 1: PostgreSQL 是什么 🚀