PostgreSQL 特性
问题
PostgreSQL 相比 MySQL 有哪些独特特性?
答案
PostgreSQL vs MySQL
| 维度 | PostgreSQL | MySQL |
|---|---|---|
| 定位 | 功能丰富的对象关系数据库 | 简单高效的关系数据库 |
| JSONB | 原生支持,可建索引 | JSON 类型,功能较弱 |
| 全文搜索 | 内置 tsvector | 基础 FULLTEXT |
| CTE 性能 | 优秀 | MySQL 8.0+ 支持 |
| 窗口函数 | 完整支持 | MySQL 8.0+ 支持 |
| 扩展 | 丰富(PostGIS、pgvector) | 插件较少 |
| 并发 | MVCC(无锁读) | MVCC + 间隙锁 |
JSONB 类型
jsonb.sql
-- 创建含 JSONB 列的表
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(200),
metadata JSONB NOT NULL DEFAULT '{}'
);
-- 插入 JSON 数据
INSERT INTO products (name, metadata) VALUES
('iPhone', '{"color": "black", "storage": 256, "tags": ["phone", "apple"]}');
-- 查询 JSON 字段
SELECT name, metadata->>'color' AS color
FROM products
WHERE metadata->>'storage' = '256';
-- JSON 数组包含
SELECT * FROM products
WHERE metadata @> '{"tags": ["apple"]}';
-- 为 JSONB 建 GIN 索引
CREATE INDEX idx_metadata ON products USING GIN (metadata);
窗口函数
window-functions.sql
-- 排名
SELECT name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num
FROM employees;
-- 累计求和
SELECT date, amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM orders;
-- 前后行对比
SELECT date, amount,
LAG(amount, 1) OVER (ORDER BY date) AS prev_amount,
amount - LAG(amount, 1) OVER (ORDER BY date) AS diff
FROM daily_sales;
CTE 公共表表达式
cte.sql
-- 递归 CTE:树形结构查询
WITH RECURSIVE category_tree AS (
-- 基础条件
SELECT id, name, parent_id, 0 AS depth
FROM categories WHERE parent_id IS NULL
UNION ALL
-- 递归条件
SELECT c.id, c.name, c.parent_id, ct.depth + 1
FROM categories c
JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree ORDER BY depth, name;
常见面试问题
Q1: 什么时候选 PostgreSQL?
答案:
- 需要 JSONB(半结构化数据)
- 复杂查询多(窗口函数、CTE、子查询)
- 需要 GIS 地理信息(PostGIS)
- 需要向量搜索(pgvector)
- 数据完整性要求高
Q2: JSONB 和 MongoDB 怎么选?
答案:
- PostgreSQL JSONB:关系型 + 文档的混合,既有 SQL 查询能力又支持灵活 JSON
- MongoDB:纯文档数据库,大量文档操作、水平扩展更方便
少量 JSON 字段 → PostgreSQL;整体数据模型都是文档 → MongoDB。
Q3: PostgreSQL 的扩展有哪些常用的?
答案:
| 扩展 | 用途 |
|---|---|
| pgvector | 向量搜索(AI 应用) |
| PostGIS | 地理信息系统 |
| pg_trgm | 模糊搜索 |
| timescaledb | 时序数据 |
| pg_stat_statements | SQL 性能分析 |
相关链接
- MySQL 基础与查询 - MySQL 对比
- 向量数据库 - pgvector 应用