楼层: 首页/ 软件技术/ 数据库三剑客/ 三库对比与选型
06

三库对比与选型

Cross-DB Reference & Picking the Right One

学完三家,最后一件事:把它们的语法差异摆在一起,再给你一张"该选谁"的决策树。这是你以后换工作、做技术选型时真正用得上的部分。

5.1 语法差异对照表

同一个需求,三种写法(背下来,面试和迁移都用得上)
需求MySQLOraclePostgreSQL
分页LIMIT 10 OFFSET 20OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLYLIMIT 10 OFFSET 20
自增主键BIGINT AUTO_INCREMENTNUMBER + SEQUENCEBIGSERIAL
字符串拼接CONCAT(a,b)a || ba || b
当前时间NOW()SYSDATE(FROM DUAL)NOW() / CURRENT_TIMESTAMP
类型对应INT / VARCHAR / TEXT / DATETIMENUMBER / VARCHAR2 / CLOB / DATEINT / 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 特性差异对照表

能力位对比
能力MySQLOraclePostgreSQL
JSONJSON 类型,可索引23ai JSON 关系二元性JSONB 最强,GIN 索引
向量 / AI8.x 有向量类型23ai 原生向量pgvector 生态成熟
地理空间基础空间类型SDO 空间PostGIS 业界标杆
存储过程过程式 SQLPL/SQL 最强PL/pgSQL
复制主从 / MGRData 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 更香:

什么时候该请 NoSQL 出马
需求推荐
缓存、排行榜、Session、计数器Redis(内存级,快)。MySQL 扛不住的高频读先放 Redis。
海量向量检索、RAG规模小用 pgvector;上亿级向量上 Milvus / Qdrant。
全文搜索Elasticsearch / OpenSearch(比数据库全文索引专业)。
KV / 文档、Schema 经常变MongoDB。
宽表、海量写入、时序数据ClickHouse(分析)、InfluxDB(监控时序)。

配现代典型架构

真实线上系统常常是组合拳:关系库(MySQL/PG)当"事实主存"保证 ACID,Redis 当缓存挡热点读,Elasticsearch 管搜索,消息队列扛异步流量。数据库不是唯一答案,而是这套组合里最稳的那块地基。