graph TD
subgraph "PostgreSQL: 进程模型"
PM[Postmaster<br/>主进程] --> W1[Backend<br/>Worker 1]
PM --> W2[Backend<br/>Worker 2]
PM --> W3[Backend<br/>Worker N]
PM --> BW[Background Writer]
PM --> WW[WAL Writer]
PM --> AP[Autovacuum]
PM --> CK[Checkpointer]
W1 --> SM[Shared Memory<br/>Shared Buffers / WAL Buffers]
W2 --> SM
W3 --> SM
end
subgraph "MySQL InnoDB: 线程模型"
MS[mysqld<br/>单进程] --> T1[Connection Thread 1]
MS --> T2[Connection Thread 2]
MS --> T3[Connection Thread N]
MS --> BP[Buffer Pool]
MS --> RT[Redo Thread]
MS --> PT[Purge Thread]
MS --> IO[IO Threads]
end
维度
PostgreSQL
MySQL (InnoDB)
并发模型
多进程(一连接一进程)
多线程(线程池)
内存共享
Shared Memory
进程内共享
连接开销
较大(fork进程)
较小(创建线程)
连接池
通常需要PgBouncer
内置线程池(企业版)
崩溃隔离
一个连接崩溃不影响其他
一个线程崩溃可能影响整个进程
存储引擎
graph LR
subgraph MySQL
A[SQL Layer] --> B[InnoDB]
A --> C[MyISAM]
A --> D[Memory]
A --> E[NDB Cluster]
A --> F[...]
end
subgraph PostgreSQL
G[SQL Layer] --> H[Heap Storage<br/>统一的存储管理]
H --> I[Table AM API<br/>可扩展接口]
I --> J[Heap AM<br/>默认]
I --> K[zheap<br/>实验性]
I --> L[Columnar<br/>Citus扩展]
end
graph LR
subgraph "InnoDB MVCC"
A["Clustered Index<br/>当前最新版本<br/>name='Carol'<br/>DB_TRX_ID=300"] --> B["Undo Log<br/>name='Bob'<br/>DB_TRX_ID=200"]
B --> C["Undo Log<br/>name='Alice'<br/>DB_TRX_ID=100"]
end
subgraph "Purge线程清理"
D[Purge Thread] -.->|清理不再需要的| C
end
-- 不可见索引(MySQL 8.0+,用于测试删除索引的影响) ALTERTABLE orders ALTER INDEX idx_status INVISIBLE; -- 优化器不再使用此索引,但索引仍在维护 -- 确认无影响后再真正删除 ALTERTABLE orders DROP INDEX idx_status;
-- GIN索引加速JSON查询 CREATE INDEX idx_attrs ON products USING gin (attributes); CREATE INDEX idx_attrs_path ON products USING gin (attributes jsonb_path_ops);
-- JSONB聚合 SELECT attributes ->>'brand'AS brand, AVG((attributes #>>'{specs,ram}')::int) AS avg_ram FROM products GROUPBY attributes ->>'brand';
-- JSONB修改 UPDATE products SET attributes = jsonb_set( attributes, '{specs,ram}', '16' ) WHERE name ='Galaxy S24';
-- 创建包含全文搜索向量的列 ALTERTABLE articles ADDCOLUMN tsv tsvector; UPDATE articles SET tsv = to_tsvector('english', title ||' '|| content); CREATE INDEX idx_tsv ON articles USING gin(tsv);
-- 搜索结果排序 SELECT title, ts_rank(tsv, query) AS rank FROM articles, to_tsquery('english', 'database | index') query WHERE tsv @@ query ORDERBY rank DESC;
-- 搜索结果高亮 SELECT title, ts_headline('english', content, to_tsquery('database'), 'StartSel=<b>, StopSel=</b>') FROM articles WHERE tsv @@ to_tsquery('database');
-- 中文全文搜索(需要安装 zhparser 扩展) CREATE EXTENSION zhparser; CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser); ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple; SELECT*FROM articles WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '数据库');
MySQL 全文搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- 创建全文索引 ALTERTABLE articles ADD FULLTEXT INDEX ft_content(title, content) WITH PARSER ngram;
-- 窗口函数示例(PostgreSQL更丰富) SELECT user_id, amount, SUM(amount) OVER (PARTITIONBY user_id ORDERBY created_at ROWSBETWEEN UNBOUNDED PRECEDING ANDCURRENTROW) AS running_total, PERCENT_RANK() OVER (PARTITIONBY user_id ORDERBY amount) AS pct_rank, LAG(amount, 1) OVER (PARTITIONBY user_id ORDERBY created_at) AS prev_amount FROM orders;
-- PostgreSQL独有: LATERAL JOIN SELECT u.*, recent_orders.* FROM users u, LATERAL ( SELECT*FROM orders o WHERE o.user_id = u.id ORDERBY o.created_at DESC LIMIT 5 ) recent_orders;
-- PostgreSQL独有: FILTER子句 SELECT COUNT(*) AS total, COUNT(*) FILTER (WHERE status ='paid') AS paid_count, SUM(amount) FILTER (WHERE status ='shipped') AS shipped_amount FROM orders;
-- 范围类型 CREATETABLE reservations ( room_id INT, during TSTZRANGE, -- 时间范围 EXCLUDE USING gist (room_id WITH=, during WITH&&) -- 排他约束防止重叠 ); INSERTINTO reservations VALUES (1, '[2025-01-01, 2025-01-05)'); -- 插入重叠时段会报错
-- 自定义类型 CREATE TYPE address AS ( street TEXT, city TEXT, zipcode TEXT );
-- 2. 可扩展性 -- 自定义函数(多种语言) CREATEFUNCTION fibonacci(n INT) RETURNSINTAS $$ BEGIN IF n <=1THENRETURN n; END IF; RETURN fibonacci(n-1) + fibonacci(n-2); END; $$ LANGUAGE plpgsql;
flowchart TD
A[选择数据库] --> B{应用类型?}
B -->|Web应用<br/>高并发简单查询| C[MySQL]
B -->|数据分析<br/>复杂查询| D[PostgreSQL]
B -->|地理信息GIS| E[PostgreSQL + PostGIS]
B -->|JSON文档存储| F[PostgreSQL JSONB]
B -->|时序数据| G[PostgreSQL + TimescaleDB]
C --> C1[优势: 成熟生态<br/>简单运维<br/>丰富的工具链]
D --> D1[优势: 强大优化器<br/>丰富数据类型<br/>标准兼容性]
H{团队情况?}
H -->|MySQL经验丰富| C
H -->|需要高级SQL特性| D
H -->|云原生首选| I["两者皆可<br/>AWS RDS / Cloud SQL"]