PostgreSQL 是一套免費開源的關聯式資料庫管理系統:支援完整 SQL 標準、事務(ACID)、JSONB 半結構化資料與 pgvector 向量搜尋,目前最新穩定版是 18.6(PostgreSQL 19 預計 2026 年 9 月底正式發布)。它常年位居 DB-Engines 排行榜前四名,是 2026 年「新專案預設資料庫」的首選——無論你要開發 Web API、分析資料,還是幫 AI 應用做 RAG 向量庫,PostgreSQL 都能一套搞定。
如果你在 most.tw 看過本站的自架系列,會發現一個現象:從 n8n、Vaultwarden 到各種 AI 工具,幾乎所有重量級開源專案都把 PostgreSQL 列為推薦資料庫——Supabase 這類「開源 Firebase」本質上就是把 PostgreSQL 包上一層好用的 API。這篇文章就從零開始,把 PostgreSQL 的原理與實戰一次講清楚。
PostgreSQL 是什麼?為什麼 2026 年值得學?
PostgreSQL(暱稱 Postgres)從 1996 年誕生至今已發展 30 年,是全球最成熟的開源資料庫。它與 MySQL 並列兩大開源主流,但近年聲勢明顯看漲,原因有三:
- 免費且功能齊全:不像 Oracle、SQL Server 要付授權費,Postgres 不只免費,功能還追上商業資料庫——視窗函數、CTE、部分索引、表分區、邏輯複寫樣樣都有。
- 一庫多用:用 JSONB 欄位就能同時存「文件」,不必為了半結構化資料另外養一套 MongoDB;用擴充套件(extensions)可以長出向量搜尋(pgvector)、全文檢索、地理資訊(PostGIS)等能力。
- AI 時代的基礎設施:RAG 應用要的向量資料庫、知識庫要的圖形查詢(PostgreSQL 19 加入 SQL/PGQ),Postgres 全部以「擴充套件」形式長出來——學一套,終身受用。
版本現況:18.6 穩定、19 即將報到
PostgreSQL 每年 9 月發布一個大版本,每個大版本支援 5 年。2026 年 9 月此刻的狀態:
| 版本 | 狀態 | 說明 |
|---|---|---|
| PostgreSQL 18.6 | ✅ 最新穩定版 | 2025-09-25 首發,支援至 2030-11-14;2026-08-13 釋出 18.6 |
| PostgreSQL 19 | 🧪 Beta 3 測試中 | 預計 2026 年 9 月底正式發布 |
| PostgreSQL 17 / 16 | ✅ 穩定 | 分別支援至 2029-11 與 2028-11 |
| PostgreSQL 14 | ⚠️ 即將 EOL | 2026-11-12 停止支援,還在用的建議升級 |
PostgreSQL 18 的重點在 I/O 與可觀測性:全新的非同步 I/O 子系統、近乎重寫的 pg_stat_io 統計視圖、B-Tree 跳過掃描(Skip Scans,解決多欄位聯合索引的老問題)、分區表查詢規劃優化,以及 autovacuum 的「積極凍結」機制。
PostgreSQL 19 的重點轉向維運與開發體驗:支援 SQL:2023 標準的屬性圖查詢(SQL/PGQ,可直接用 MATCH 語法查詢圖譜關係)、原生 REPACK ... CONCURRENTLY(不用再裝第三方 pg_repack 就能在線重整肥大的表)、ALTER TABLE ... MERGE/SPLIT PARTITIONS 原生分區調整、UPDATE/DELETE ... FOR PORTION OF 時間區間操作,TOAST 預設壓縮也換成更快的 LZ4。
💡 升級提醒:PostgreSQL 大版本升級不能直接蓋過去的資料目錄,需要用
pg_dump倒出再倒入,或官方pg_upgrade工具(Docker 使用者若把 volume 掛在/var/lib/postgresql父目錄,可搭配pg_upgrade --link更順暢地升級)。
第一步:用 Docker 安裝 PostgreSQL
Docker 是最快的安裝方式,也是本站所有自架服務的標準做法(不熟 Docker 可以先看這篇)。建立 compose.yaml:
services:
db:
image: postgres:18 # 官方映像,直接指定大版本號
container_name: postgres-dev
environment:
POSTGRES_PASSWORD: mysecretpassword # 必填:superuser 密碼
# POSTGRES_USER: postgres # 選填,預設 postgres
# POSTGRES_DB: myapp # 選填,預設建立的資料庫名
ports:
- "127.0.0.1:5432:5432" # 只綁本機,避免資料庫暴露到公網
volumes:
- postgres_data:/var/lib/postgresql # 命名 volume,資料持久化
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
兩個關鍵細節(都是 Docker 官方文件的最佳實踐):
- 掛載
/var/lib/postgresql父目錄:PostgreSQL 18 起官方映像把資料放在版本專屬子目錄(如/var/lib/postgresql/18/...)。掛載父目錄而非/var/lib/postgresql/data,未來升級大版本時才能用pg_upgrade --link免倒檔升級。 - 只用
127.0.0.1綁定:除非你真的要對外提供資料庫服務,否則別寫"5432:5432"——把資料庫暴露到公網是資安災難的起點。
啟動並驗證:
docker compose up -d
docker compose exec db psql -U postgres -c "SELECT version();"
# 看到 PostgreSQL 18.6 ... 就代表成功了
想在本機(非 Docker)安裝?Ubuntu/Debian 一行搞定:sudo apt install postgresql,安裝後服務自動啟動,用 sudo -u postgres psql 進入管理介面。
psql 常用指令速查表
psql 是 PostgreSQL 的命令列客戶端,以下是最常用的操作:
| 指令 | 功能 |
|---|---|
psql -U postgres -d myapp | 連線(-h 可指定主機) |
\l | 列出所有資料庫 |
\c myapp | 切換到 myapp 資料庫 |
\dt | 列出目前資料庫的所有資料表 |
\d 表名 | 顯示資料表結構(欄位、索引、約束) |
\du | 列出所有使用者與角色 |
\q | 離開 psql |
建立資料庫與使用者、授權是每天都會用到的操作:
-- 建立使用者與資料庫(在 postgres 預設庫執行)
CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE myapp OWNER myuser;
-- 授權:資料庫層級要帶 DATABASE 關鍵字
GRANT CONNECT, CREATE ON DATABASE myapp TO myuser;
⚠️ 與 MySQL 不同:PostgreSQL 的
GRANT ... ON DATABASE不會自動授權裡面的資料表,表格權限要另外在該資料庫內設定(GRANT SELECT, INSERT, UPDATE, DELETE ON 表名 TO myuser;)。初學者最常卡關的就是這裡。
第一個資料表:CRUD 與 JSONB 實戰
建立一個簡單的產品表,順便示範 Postgres 的招牌能力——JSONB 半結構化欄位:
-- 切換到 myapp 資料庫後執行
CREATE TABLE products (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 現代寫法,取代老舊 SERIAL
name TEXT NOT NULL,
price NUMERIC(10,2) NOT NULL,
attributes JSONB, -- 彈性的結構化欄位:放規格、標籤等
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- 插入:JSONB 欄位直接丟 JSON 物件
INSERT INTO products (name, price, attributes)
VALUES ('無線機械鍵盤', 2990, '{"layout": "75%", "switch": "茶軸", "wireless": true}');
-- 查詢 JSONB 內容(-> 回傳 JSON,->> 回傳純文字)
SELECT name, attributes->>'switch' AS 軸體
FROM products
WHERE attributes->>'wireless' = 'true';
JSONB 最強的地方是可以直接對文件內容建立索引,用 GIN 索引加速查詢:
CREATE INDEX idx_products_attrs ON products USING GIN (attributes);
-- 之後 WHERE attributes @> '{"wireless": true}' 這類查詢就會走索引
PostgreSQL 的設計哲學是「關聯式為主、文件為輔」:需要強一致與 JOIN 的資料用正規表格,欄位會變來變去的用 JSONB——兩者還能混合查詢。想比較 Postgres 與嵌入式資料庫 SQLite、分析型 DuckDB 的定位差異,可以參考文末表格。
索引與 EXPLAIN:效能調校的第一步
查詢變慢時,先別急著加硬體。用 EXPLAIN ANALYZE 看執行計畫:
EXPLAIN ANALYZE SELECT * FROM products WHERE price > 1000;
輸出會告訴你 PostgreSQL 是「Seq Scan」(全表掃描)還是「Index Scan」。建立索引的方式:
CREATE INDEX idx_products_price ON products (price); -- B-Tree(預設)
CREATE INDEX idx_products_name_lower ON products (lower(name)); -- 函式索引
PostgreSQL 的預設 B-Tree 索引涵蓋九成以上需求;JSONB 用 GIN、全文檢索用 GIN、向量用 HNSW/IVFFlat(下面介紹)。索引不是越多越好——寫入會變慢、磁碟會變肥,觀察實際查詢再建立即可。
日常維護方面,PostgreSQL 的 autovacuum 會自動清理死資料列(MVCC 的副作用),通常不需要手動介入;只有當你發現表異常肥大、查詢越來越慢時,才需要研究 vacuum 與 bloat 問題。
pgvector:AI 時代的向量搜尋
這是 2026 年學 PostgreSQL 最大的理由:裝一個擴充套件,你的關聯式資料庫立刻變成向量資料庫,可以直接為 RAG(檢索增強生成)應用服務,不必另外架設專用向量庫。
啟用方式(使用官方含 pgvector 的映像,或本機 CREATE EXTENSION):
# Docker:改用 pgvector 官方映像(已內建擴充套件)
# image: pgvector/pgvector:pg18
-- 1. 啟用擴充套件
CREATE EXTENSION IF NOT EXISTS vector;
-- 2. 建立含向量欄位的資料表(以 OpenAI embedding 常見的 1536 維為例)
CREATE TABLE documents (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
content TEXT NOT NULL,
embedding vector(1536)
);
-- 3. 插入向量(把文字丟給 embedding API 產生向量後存入)
INSERT INTO documents (content, embedding)
VALUES ('PostgreSQL 是開源關聯式資料庫', '[0.012, -0.034, ...]'::vector);
-- 4. 相似度搜尋:<=> 是餘弦距離運算子,越小越相似
SELECT id, content, embedding <=> '[0.010, -0.030, ...]'::vector AS distance
FROM documents
ORDER BY embedding <=> '[0.010, -0.030, ...]'::vector
LIMIT 5;
百萬級向量請加上 HNSW 索引(查詢從秒級降到毫秒級):
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
把 pgvector 接進 RAG 管線的完整架構大概是這樣:
flowchart LR
A[文件/PDF] --> B[切塊 Chunking]
B --> C[Embedding API]
C --> D[(PostgreSQL + pgvector)]
E[使用者問題] --> F[Embedding API]
F --> G[向量相似度搜尋]
D --> G
G --> H[Top-K 相關片段]
H --> I[LLM 生成回答]
style D fill:#336791,color:#fff如果你在找「哪個向量資料庫比較適合我的專案」,這篇何謂 Vector Database 文章可以參考——但多數新專案的答案其實是:先別急著引進新系統,Postgres + pgvector 就夠了。
備份與還原:pg_dump 標準流程
PostgreSQL 官方備份工具是 pg_dump。小資料庫用純 SQL 格式即可,正式環境建議用自訂格式(-F c)或目錄格式(-F d),支援壓縮與選擇性還原:
# Docker 環境:進到容器內執行
docker compose exec db pg_dump -U postgres -F c -d myapp -f /tmp/myapp.dump
docker compose cp db:/tmp/myapp.dump ./backup-$(date +%F).dump
# 大資料庫用目錄格式 + 平行備份(-j 4 = 4 個執行緒)
pg_dump -F d -j 4 -d myapp -f /backup/myapp_dir/
# 還原(先建立空的資料庫)
pg_restore -U postgres -d myapp /tmp/myapp.dump
# 目錄格式可平行還原:pg_restore -j 4 -d myapp /backup/myapp_dir/
進階一點,用 cron 每天備份 + 保留最近 7 份,是自架服務的基本衛生習慣;需要即時複本的話再研究 streaming replication 或邏輯複寫。
PostgreSQL vs MySQL vs SQLite:怎麼選?
| 比較項 | PostgreSQL | MySQL | SQLite |
|---|---|---|---|
| 定位 | 功能完整的伺服器資料庫 | 普及度高的伺服器資料庫 | 嵌入式單檔資料庫 |
| 授權 | PostgreSQL License(免費) | GPL(甲骨文持有) | 公有領域 |
| JSON 支援 | JSONB(二進位、可索引) | JSON 類型(功能較弱) | JSONB(v3.45+ 強化) |
| 擴充套件 | 極豐富(pgvector/PostGIS…) | 較少 | 編譯期內建 |
| 適合場景 | 新專案預設、複雜查詢、AI/RAG | 既有生態、代管服務(AWS RDS) | 單機工具、原型、邊緣裝置 |
| 本站教學 | ✅ 本篇 | — | SQLite 完整教學 |
一句話總結:沒有特別理由就用 PostgreSQL——這是 2026 年開源社群的主流共識;SQLite 留給單機小工具,MySQL 留給你已經很熟的既有環境。
總結:PostgreSQL 學習路徑
flowchart LR
A[Docker 安裝] --> B[psql 與 CRUD]
B --> C[JSONB 文件實戰]
C --> D[索引與 EXPLAIN]
D --> E[pg_dump 備份]
D --> F[pgvector 向量搜尋]
E --> G[日常維運與調校]
F --> GPostgreSQL 的學習曲線比 SQLite 陡一點,但投資報酬率極高:它是 2026 年最多新專案預設的資料庫、Supabase 等 BaaS 的底層、也是 AI 應用向量檢索的事實標準之一。照著本篇走完 Docker 安裝 → psql → JSONB → 索引 → pgvector → 備份,你就已經具備把任何 side project 或公司服務架在 PostgreSQL 上的完整能力了。
原始來源:PostgreSQL 官方版本政策|PostgreSQL 18.6/19 Beta 3 發布公告|Docker Docs: PostgreSQL specific guide|PostgreSQL 18 vs 19 功能比較(Jatin Jainsaraf)|pgvector GitHub
