PostgreSQL: PostgreSQL入门指南:什么是PostgreSQL及为何选择它

PostgreSQL 是世界上最先进的开源关系型数据库——它以可靠性、扩展性和标准合规性闻名,被 Apple、Instagram、Spotify 等全球顶级公司信赖。

1. 你将学到


2. 一个全栈开发者的真实故事

(1) 痛点:数据库选型令人困惑

Alice 是一名全栈开发者,公司正在启动一个新的电商项目。技术选型会议上,团队在 MySQL 和 PostgreSQL 之间争论不休:

她需要一份客观、全面的对比分析来做出决策。

(2) PostgreSQL 的解法

PostgreSQL 用一个数据库就能覆盖大多数业务需求——从传统关系型查询到 JSON 文档存储,从全文搜索到向量检索,无需引入额外的中间件:

SQL
-- PostgreSQL: one database for multiple use cases

-- 1. Traditional relational query
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.name;

-- 2. JSONB flexible storage (no need for MongoDB)
INSERT INTO products (name, attributes)
VALUES ('Running Shoes', '{"color": "red", "size": 42, "tags": ["sport", "outdoor"]}'::jsonb);

-- 3. Full-text search (no need for Elasticsearch)
SELECT name FROM products
WHERE to_tsvector('english', name) @@ to_tsquery('english', 'running & shoes');

(3) 收益

Alice 发现,选择 PostgreSQL 意味着:


3. 什么是数据库

数据库(Database)是按照一定结构组织、存储和管理数据的系统。没有数据库,应用程序的数据只能存在内存中——程序一旦关闭,数据就消失了。

(1) 关系型 vs 非关系型数据库

维度 关系型(RDBMS) 非关系型(NoSQL)
数据模型 表格(行+列),严格 Schema 文档/键值/图/列族,灵活 Schema
查询语言 SQL(标准化) 各自专有 API
事务支持 ACID 强一致性 多数仅最终一致性
典型代表 PostgreSQL、MySQL、Oracle MongoDB、Redis、Cassandra
适用场景 复杂查询、事务处理、数据一致性要求高 高吞吐、灵活结构、快速迭代
扩展方式 垂直扩展为主 水平扩展为主
100%
graph TB
    DB[Database] --> RDBMS[Relational DB<br/>SQL + ACID]
    DB --> NoSQL[NoSQL<br/>Flexible Schema]
    RDBMS --> PG[PostgreSQL]
    RDBMS --> MY[MySQL]
    RDBMS --> OR[Oracle]
    NoSQL --> MGO[MongoDB<br/>Document]
    NoSQL --> RED[Redis<br/>Key-Value]
    NoSQL --> CAS[Cassandra<br/>Wide-Column]
💡 提示: PostgreSQL 是关系型数据库,但它的 JSONB 类型让它也能像文档数据库一样存储灵活结构——这就是 PG 被称为"一个数据库顶三个"的原因。


4. PostgreSQL 的发展历史

(1) 从 POSTGRES 到 PostgreSQL

100%
graph LR
    A["1986<br/>POSTGRES project<br/>UC Berkeley"] --> B["1995<br/>Postgres95<br/>Added SQL support"]
    B --> C["1996<br/>PostgreSQL 6.0<br/>Open Source release"]
    C --> D["2010s<br/>JSONB / CTE / Window<br/>Functions / FDW"]
    D --> E["2024<br/>PostgreSQL 17<br/>Current LTS release"]
年份 里程碑 意义
1986 POSTGRES 项目启动 Michael Stonebraker 在 UC Berkeley 启动,灵感来自 Ingres
1995 Postgres95 发布 加入了 SQL 语言支持(替代 PostQUEL 查询语言)
1996 PostgreSQL 6.0 正式更名为 PostgreSQL,以开源模式发布
2005 8.0 版本 支持 Windows 原生运行、Savepoint、两阶段提交
2012 9.2 版本 JSON 支持(9.4 升级为 JSONB),范围类型
2016 9.6 版本 并行查询、短语全文搜索
2017 10.0 版本 声明式分区、逻辑复制、SCRAM 认证
2022 15.0 版本 MERGE 命令(SQL 标准 UPSERT)
2024 17.0 版本 当前 LTS 版本,逻辑复制增强、SQL/JSON 标准完善

(2) PostgreSQL 的设计哲学

PostgreSQL 的核心设计理念可以用四个词概括:

原则 体现
标准合规 严格遵循 SQL 标准(SQL:2023),支持大多数标准特性
可扩展性 支持自定义类型、函数、索引方法、存储过程语言(通过 Extensions)
可靠性 ACID 事务、MVCC 并发控制、WAL 写前日志,默认不丢数据
社区驱动 无单一公司控制,全球 1000+ 贡献者,真正的开源
📌 重点: PostgreSQL 不是"谁的 PostgreSQL"——它由 PostgreSQL Global Development Group 维护,不受任何单一公司控制。这与 MySQL(Oracle 控制)形成鲜明对比。


5. PostgreSQL vs MySQL 对比

这是 Alice 和团队最关心的问题。以下从多个维度客观对比:

维度 PostgreSQL MySQL
架构 进程模型(每个连接一个进程) 线程模型(每个连接一个线程)
并发控制 MVCC(多版本并发控制),读写互不阻塞 表锁为主,InnoDB 行级锁但范围有限
SQL 标准 严格遵循 SQL:2023 部分遵循,有大量 MySQL 专有语法
JSON 支持 JSONB(二进制存储,索引查询极快) JSON(文本存储,功能有限)
全文搜索 内置 tsvector/tsquery,多语言支持 FULLTEXT 索引,功能基础
索引类型 6 种(B-Tree/GIN/GiST/BRIN/SP-GiST/Hash) 3 种(B-Tree/Hash/Fulltext)
扩展生态 CREATE EXTENSION,一键装功能(pgvector/PostGIS 等) 无对等机制
分区表 声明式分区(RANGE/LIST/HASH,PG 10+) 分区表(8.0+),语法较繁琐
复制 流复制 + 逻辑复制(可按表复制) 主从复制(全实例复制)
备份 PITR 时间点恢复(精确到秒) binlog 回放(较粗糙)
开源协议 PostgreSQL License(类 BSD,极自由) GPL(有商业限制)
复杂查询 窗口函数/递归 CTE/LATERAL JOIN 原生支持 8.0+ 逐步支持,功能弱于 PG
运维难度 配置项多,调优空间大 开箱即用,运维简单
市场占有率 连续 7 年 DB-Engines 增长最快的数据库 全球安装量最大

▶ 示例:UPSERT 语法对比

SQL
-- PostgreSQL: INSERT ON CONFLICT (more flexible)
INSERT INTO users (email, name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name, updated_at = NOW()
RETURNING id, name, updated_at;
-- RETURNING clause returns the affected row (MySQL has no equivalent)

输出:

TEXT 📖 仅展示
INSERT 0 1
SQL
-- MySQL: ON DUPLICATE KEY UPDATE (less flexible)
INSERT INTO users (email, name)
VALUES ('alice@example.com', 'Alice')
ON DUPLICATE KEY UPDATE name = VALUES(name), updated_at = NOW();
-- No RETURNING clause, must run a separate SELECT to get the result

▶ 示例:JSONB 查询对比

SQL
-- PostgreSQL: JSONB with GIN index (fast indexed queries)
SELECT name FROM products
WHERE attributes @> '{"color": "red"}'::jsonb;
-- @> is the "contains" operator, uses GIN index

输出:

TEXT 📖 仅展示
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)
SQL
-- MySQL: JSON function (no index support for this pattern)
SELECT name FROM products
WHERE JSON_CONTAINS(attributes, '"red"', '$.color');
-- No index, full table scan

▶ 示例:全文搜索对比

SQL
-- PostgreSQL: built-in full-text search with ranking
SELECT name, ts_rank(to_tsvector('english', name || ' ' || description),
                     to_tsquery('english', 'red & shoes')) AS rank
FROM products
WHERE to_tsvector('english', name || ' ' || description)
      @@ to_tsquery('english', 'red & shoes')
ORDER BY rank DESC;

输出:

TEXT 📖 仅展示
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)
SQL
-- MySQL: basic FULLTEXT search (no ranking flexibility)
SELECT name FROM products
WHERE MATCH(name, description) AGAINST('red shoes' IN BOOLEAN MODE);
⚠️ 注意: MySQL 在简单场景(单表 CRUD、小型项目)下更易上手。PostgreSQL 的优势在复杂查询、数据完整性、高级特性上。选型应根据项目需求,而非盲目追新。


6. PostgreSQL 的核心优势

(1) ACID 事务

ACID 是保证数据可靠性的四大特性:

特性 全称 含义 PostgreSQL 实现
A Atomicity(原子性) 事务要么全部成功,要么全部回滚 WAL 写前日志
C Consistency(一致性) 事务前后数据库状态始终合法 约束/触发器/类型检查
I Isolation(隔离性) 并发事务互不干扰 MVCC 多版本并发控制
D Durability(持久性) 已提交的数据永久不丢失 WAL + fsync

(2) MVCC 多版本并发控制

MVCC 是 PostgreSQL 并发性能的核心。读操作不阻塞写操作,写操作不阻塞读操作:

场景 MySQL(InnoDB) PostgreSQL(MVCC)
读写并发 共享锁/排他锁,可能阻塞 读看到快照版本,写创建新版本,互不阻塞
长事务影响 阻塞其他事务 不阻塞,仅旧版本需保留
一致性读 需要 MVCC 但实现复杂 天然快照隔离

(3) 扩展性

PostgreSQL 的扩展机制(CREATE EXTENSION)是其最大生态优势:

扩展 功能 替代的中间件
pgvector 向量搜索 / AI 嵌入 Pinecone / Weaviate
PostGIS 地理空间查询 MongoDB Geo
pg_trgm 模糊搜索 Elasticsearch
pgcrypto 加密函数 应用层加密
uuid-ossp UUID 生成 应用层生成
postgres_fdw 跨库查询 ETL 工具

▶ 示例:扩展安装与使用

SQL
-- Check available extensions
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name IN ('uuid-ossp', 'pg_trgm', 'pgcrypto');

-- Install an extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- Use the extension to generate UUIDs
SELECT uuid_generate_v4();
-- Output: a unique UUID like 550e8400-e29b-41d4-a716-446655440000

输出:

TEXT 📖 仅展示
CREATE TABLE

▶ 示例:条件聚合 FILTER 子句

SQL
-- PostgreSQL: FILTER clause for conditional aggregation (SQL standard)
SELECT
    store_id,
    COUNT(*) AS total_orders,
    COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
    COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled_orders
FROM orders
GROUP BY store_id;

输出:

TEXT 📖 仅展示
 count 
-------
     5
(1 row)
SQL
-- MySQL: must use SUM(IF()) or SUM(CASE) workaround
SELECT
    store_id,
    COUNT(*) AS total_orders,
    SUM(IF(status = 'completed', 1, 0)) AS completed_orders,
    SUM(IF(status = 'cancelled', 1, 0)) AS cancelled_orders
FROM orders
GROUP BY store_id;

7. PostgreSQL 的典型应用场景

场景 PG 特性 案例
电商系统 JSONB 商品属性 + 全文搜索 + 分区表 商品 SKU 动态属性存储、商品搜索、按月分区订单表
SaaS 多租户 RLS 行级安全 + Schema 隔离 一个数据库服务多个租户,行级策略隔离数据
数据分析 窗口函数 + 物化视图 + CTE 用户留存分析、销售趋势报表、复杂统计查询
AI / 推荐系统 pgvector 向量搜索 商品相似推荐、语义搜索、RAG 应用
GIS 地理服务 PostGIS 扩展 地图应用、距离计算、路径规划
金融系统 ACID + 3 级隔离 + PITR 交易转账、对账、时间点恢复
内容管理 全文搜索 + JSONB 文章搜索、标签管理、灵活内容结构

▶ 示例:电商场景——JSONB 存储商品属性

SQL
-- Different products have different attributes
-- No need for separate tables or columns for each attribute type

INSERT INTO products (name, price, attributes) VALUES
    ('Running Shoes', 89.99, '{"color": "red", "size": 42, "weight_grams": 280}'::jsonb),
    ('Laptop', 1299.00, '{"cpu": "M3", "ram_gb": 16, "screen_inch": 14}'::jsonb),
    ('Coffee Beans', 24.50, '{"origin": "Colombia", "roast": "medium", "weight_kg": 1}'::jsonb);

-- Query: find all red products under $100
SELECT name, price, attributes
FROM products
WHERE price < 100
  AND attributes @> '{"color": "red"}'::jsonb;

输出:

TEXT 📖 仅展示
     name      | price  |                 attributes
---------------+--------+--------------------------------------------
 Running Shoes |  89.99 | {"color": "red", "size": 42, "weight_grams": 280}

8. 完整示例:数据库选型决策流程

SQL
-- ============================================
-- Comprehensive example: PostgreSQL feature demo
-- Shows why one PG database can replace multiple tools
-- ============================================

-- 1. ACID transaction (no need for application-level consistency)
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;

-- 2. JSONB storage (no need for MongoDB)
INSERT INTO products (name, attributes)
VALUES ('Smart Watch', '{"color": "black", "battery_life_hours": 48, "waterproof": true}'::jsonb);

-- 3. Full-text search (no need for Elasticsearch)
SELECT name, ts_rank(
    to_tsvector('english', name),
    plainto_tsquery('english', 'smart watch')
) AS relevance
FROM products
WHERE to_tsvector('english', name) @@ plainto_tsquery('english', 'smart watch')
ORDER BY relevance DESC;

-- 4. Window function (no need for application-level ranking)
SELECT name, price,
    RANK() OVER (ORDER BY price DESC) AS price_rank
FROM products;

-- 5. UPSERT (no need for application-level conflict handling)
INSERT INTO products (name, price, attributes)
VALUES ('Smart Watch', 199.99, '{"color": "black", "battery_life_hours": 48}'::jsonb)
ON CONFLICT (name)
DO UPDATE SET price = EXCLUDED.price,
              attributes = EXCLUDED.attributes
RETURNING id, name, price;

输出(节选):

TEXT 📖 仅展示
 -- UPSERT RETURNING output:
 id |    name     | price
----+-------------+--------
  1 | Smart Watch | 199.99

❓ 常见问题

Q PostgreSQL 完全免费吗?有没有隐藏的商业许可?
A PostgreSQL 使用 PostgreSQL License(类 BSD 协议),可以免费使用、修改、分发,包括商业用途,没有任何隐藏费用。这比 MySQL 的 GPL 协议更自由——你甚至不需要开源你的应用代码。
Q PostgreSQL 适合小型项目吗?会不会太重了?
A PostgreSQL 最小安装只需约 50 MB 内存即可运行。对于小型项目,PG 的零配置模式开箱即用。与 MySQL 相比,PG 的默认配置已足够安全可靠,小项目不会感到"过重"。
Q 我应该选择 PostgreSQL 还是 MySQL?
A 如果你的项目需要复杂查询、JSONB、全文搜索、GIS、高并发写入,选 PostgreSQL。如果你的项目是简单的 CRUD、团队只会 MySQL、需要极致的读性能,MySQL 也够用。2024 年以来,新增项目选择 PostgreSQL 的比例持续上升。
Q 从 MySQL 迁移到 PostgreSQL 困难吗?
A 中小型项目迁移约 1-2 周。主要工作量在 SQL 语法差异(如反引号→双引号、AUTO_INCREMENT→SERIAL/IDENTITY)。工具方面,pgLoader 可自动迁移数据和 Schema。
Q PostgreSQL 的性能真的比 MySQL 好吗?
A 在 OLTP(简单读写)场景,两者性能接近。在高并发写入、复杂 JOIN、窗口函数、JSONB 查询等场景,PostgreSQL 明显优于 MySQL。PG 的 MVCC 让读写互不阻塞,这是核心优势。
Q 学习 PostgreSQL 需要先学 MySQL 吗?
A 不需要。PostgreSQL 的 SQL 更接近标准 SQL,从 PG 学起反而更好。学会了 PG,再学 MySQL 会觉得简单(因为 PG 教的更多是标准语法)。

📖 小节


📝 作业

  1. 基础题(难度⭐):列举 PostgreSQL 相比 MySQL 的 3 个独有特性(MySQL 没有或显著弱于 PG 的),并用一句话说明每个特性的好处。

  2. 进阶题(难度⭐⭐):假设你要为一个在线教育平台选择数据库,该平台需要存储课程信息(结构化)和学生笔记(非结构化),同时需要搜索课程内容。写出你选择 PostgreSQL 或 MySQL 的理由,至少引用 3 个技术特性支撑你的论点。

  3. 挑战题(难度⭐⭐⭐):阅读 PostgreSQL 官方文档的"Feature Matrix"页面(搜索"PostgreSQL Feature Matrix"),找出 3 个你在本课未提到的 PG 特色功能,并说明它们可以替代什么外部工具或中间件。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏