三库对比与选型
学完三家,最后一件事:把它们的语法差异摆在一起,再给你一张"该选谁"的决策树。这是你以后换工作、做技术选型时真正用得上的部分。
5.1 语法差异对照表
| 需求 | MySQL | Oracle | PostgreSQL |
|---|---|---|---|
| 分页 | LIMIT 10 OFFSET 20 | OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY | LIMIT 10 OFFSET 20 |
| 自增主键 | BIGINT AUTO_INCREMENT | NUMBER + SEQUENCE | BIGSERIAL |
| 字符串拼接 | CONCAT(a,b) | a || b | a || b |
| 当前时间 | NOW() | SYSDATE(FROM DUAL) | NOW() / CURRENT_TIMESTAMP |
| 类型对应 | INT / VARCHAR / TEXT / DATETIME | NUMBER / VARCHAR2 / CLOB / DATE | INT / TEXT / JSONB / TIMESTAMP |
| 字符串函数 | SUBSTRING(s,1,3) | SUBSTR(s,1,3) | SUBSTRING(s,1,3) |
| 空值处理 | IFNULL(x,0) | NVL(x,0) | COALESCE(x,0) |
顺手把面试和文档里常出现的中英术语对一下,免得看英文资料发懵。
| 英文 | 中文 / 含义 |
|---|---|
| Row / Record | 行 / 记录 |
| Column / Field | 列 / 字段 |
| Schema | 模式,一组表/对象的命名空间 |
| Query Optimizer | 查询优化器,选执行计划的 |
| Execution Plan | 执行计划(EXPLAIN 的输出) |
| Deadlock | 死锁 |
| Hot Backup | 热备(不中断服务) |
| Point-in-Time Recovery (PITR) | 时间点恢复 |
| Write-Ahead Log (WAL / redo log) | 预写日志,保证持久性 |
| Replication | 复制(主从) |
5.2 特性差异对照表
| 能力 | MySQL | Oracle | PostgreSQL |
|---|---|---|---|
| JSON | JSON 类型,可索引 | 23ai JSON 关系二元性 | JSONB 最强,GIN 索引 |
| 向量 / AI | 8.x 有向量类型 | 23ai 原生向量 | pgvector 生态成熟 |
| 地理空间 | 基础空间类型 | SDO 空间 | PostGIS 业界标杆 |
| 存储过程 | 过程式 SQL | PL/SQL 最强 | PL/pgSQL |
| 复制 | 主从 / MGR | Data Guard / RAC | 流复制 / Patroni |
| 开源协议 | GPL | 商业付费 | PostgreSQL License(类 BSD) |
5.3 选型决策树
选拿到一个需求,三步定位
第一步:预算和已有资产。公司已经买了 Oracle 许可证、有 RAC 集群、DBA 全是 Oracle 背景——那就继续用 Oracle,别折腾迁移。
第二步:数据类型有没有"硬需求"。要做地图/GIS?要做 AI 向量检索 RAG?要存复杂 JSON 并查内部字段?要递归查询组织架构?这些PG 一家通吃,选 PostgreSQL。
第三步:剩下的大多数互联网业务。电商、内容、社交、后台管理——MySQL 就够了,招人易、生态大、运维熟。别用 PostgreSQL 的"先进"去overkill一个简单的 CRUD。
5.4 综合练习题 10 道
1.(选型)要做一个电商后台,预计日活几十万,团队都熟 MySQL,选谁?
答案
MySQL。业务是典型 CRUD + 高并发读,MySQL 生态和人才最匹配,没必要上重武器。
2.(选型)要做一个 AI 客服知识库 RAG,需要存文档向量并和业务用户表 JOIN,选谁?
答案
PostgreSQL + pgvector。一个库搞定向量和业务数据,不用维护两套。
3.(选型)银行核心账务系统,要求 7×24 不宕、强一致、有成熟容灾,选谁?
答案
Oracle(RAC + Data Guard)。金融核心对稳定性和 support 的要求压倒一切。
4.(语法)MySQL 里 SELECT NOW() FROM DUAL 能跑吗?
答案
能跑,但多余——MySQL 的 DUAL 是可省略的伪表,直接 SELECT NOW() 就行。Oracle 里才必须写 FROM DUAL。
5.(语法)PG 里怎么实现"不存在就插入,存在就更新"?
答案
INSERT ... ON CONFLICT (唯一键) DO UPDATE SET ...。MySQL 对应 ON DUPLICATE KEY UPDATE。
6.(索引)JSONB 字段查内部城市,MySQL 和 PG 分别怎么建索引?
答案
PG 给 JSONB 建 GIN 索引;MySQL 8.0 可对 JSON 列建多值/函数索引,或把要查的字段单独抽成生成列再建索引。
7.(事务)三家默认隔离级别分别是什么?
答案
MySQL 可重复读;Oracle 读已提交;PostgreSQL 读已提交。
8.(备份)MySQL 在线热备不锁库用哪个参数?
答案
mysqldump 加 --single-transaction;大库用 xtrabackup 物理热备。
9.(高可用)Oracle 的 RAC 和 Data Guard 有什么区别?
答案
RAC 多实例共享存储、同地集群高并发高可用;Data Guard 主备异地、做容灾。两者常一起用。
10.(运维)PG 表越用越胖,要做什么?
答案
VACUUM(autovacuum 自动跑)回收死元组;必要时 VACUUM FULL 或 pg_repack 物理收缩。
5.5 跳出三剑客:什么时候该用 NoSQL
学完三家关系型数据库,最后说句公道话:不是所有数据都该进关系库。下面这些场景,NoSQL 更香:
| 需求 | 推荐 |
|---|---|
| 缓存、排行榜、Session、计数器 | Redis(内存级,快)。MySQL 扛不住的高频读先放 Redis。 |
| 海量向量检索、RAG | 规模小用 pgvector;上亿级向量上 Milvus / Qdrant。 |
| 全文搜索 | Elasticsearch / OpenSearch(比数据库全文索引专业)。 |
| KV / 文档、Schema 经常变 | MongoDB。 |
| 宽表、海量写入、时序数据 | ClickHouse(分析)、InfluxDB(监控时序)。 |
配现代典型架构
真实线上系统常常是组合拳:关系库(MySQL/PG)当"事实主存"保证 ACID,Redis 当缓存挡热点读,Elasticsearch 管搜索,消息队列扛异步流量。数据库不是唯一答案,而是这套组合里最稳的那块地基。