跳转到内容

怎么用这本书

准备中…

上面这条状态栏不是装饰。页面加载后它会下载约 3MB 的 WebAssembly,在你的浏览器里启动一个真正的 PostgreSQL 18 后端,然后建好全书统一的数据集。整个过程不经过任何服务器——你在这本书里执行的所有 SQL 都留在你自己的机器上。

先试一下:

SELECT version();
⌘/Ctrl + Enter

可运行代码块(就是上面那个):正文里凡是带「▶ 运行」的 SQL 都能改写重跑,⌘/Ctrl + Enter 是快捷键。同一页面里的代码块共享同一个数据库连接,并且按你点击的顺序改变状态——前一个块建的表,后一个块就能查到。想回到干净状态,点状态栏右侧的「重置数据集」。

执行计划视图:把 EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) 的结果渲染成树,并把「估算行数与实际行数偏差超过 10 倍」的节点标红——那通常就是慢查询的根因。

双会话时间线:用于隔离级别、锁等待、死锁这类必须两个会话交错才能演示的场景。

一个刻意简化的订单系统,四张表:

SELECT
c.relname AS "表",
c.reltuples::bigint AS "行数估计",
pg_size_pretty(pg_total_relation_size(c.oid)) AS "总大小"
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relkind = 'r'
ORDER BY c.relname;
⌘/Ctrl + Enter

结构如下:

users(id, name, email, country, created_at)
products(sku, name, price numeric, tags jsonb, description text)
orders(id, user_id, amount numeric, status order_status, created_at)
order_items(id, order_id, sku, qty, price)

数据全部由 generate_series 配合质数取模生成,不含任何随机性。这意味着你看到的行数、ctid、执行计划和书里写的完全一致——否则「你应该看到 (0,2)」这种话就没法写。

SELECT id, user_id, amount, status, created_at
FROM orders
ORDER BY id
LIMIT 5;
⌘/Ctrl + Enter

按阶段顺序读。这本书的章节顺序不是知识点的字典序,而是依赖顺序:阶段三的 MVCC 是阶段四索引和阶段六存储的前置知识,跳过它,后面很多结论就只能背。

每个阶段末尾有一份「验收问题」。能用自己的话答上来再往下走。