全世界绝大多数应用背后,都蹲着三个沉默的胖子:MySQL、Oracle、PostgreSQL。它们干的是同一件事——把数据存起来,再按你的要求精准地捞回来。这一页把三家一次性讲透:从装环境、写 SQL、建索引、搞事务,到备份恢复、主从集群、面试题,最后给你一张"到底该选谁"的选型表。读完它,数据库面试的大半壁江山就拿下了。
第 1 节 · 最新版本与兼容性
版本基线:MySQL 8.4 LTS / Oracle 23ai / PostgreSQL 17,学哪档别追新。
第 2 节 · 三库对比总览
三家一句话对比:定位、许可证、擅长场景一张表认清。
第 3 节 · 数据库设计基础:ER 图、主键外键、范式
ER 图、三大范式、字段类型选型,建库前的内功。
第 4 节 · MySQL 完整章节
MySQL 全章:DDL/DML、索引 EXPLAIN、事务、主从、备份。
第 5 节 · Oracle 完整章节
Oracle 全章:PL/SQL、存储过程、RAC、企业级运维。
第 6 节 · PostgreSQL 完整章节
PostgreSQL 全章:标准 SQL、JSON、PostGIS、pgvector。
第 7 节 · 三库对比与选型
三库怎么选:按业务规模、团队、场景拍板。
第 8 节 · 分布式事务:2PC / TCC / Saga / 本地消息表
分布式事务:2PC / TCC / Saga / 本地消息表怎么选。
第 9 节 · Redis 高可用与持久化深入:RDB / AOF / 哨兵 / Cluster
Redis 高可用:持久化 RDB/AOF、主从、哨兵、Cluster。
第 10 节 · 分析型与嵌入式 OLAP:ClickHouse 与 DuckDB
分析型数据库:ClickHouse / DuckDB 列式存储实战。
第 11 节 · 数据库迁移与版本化:Flyway / Liquibase
数据库版本化:Flyway / Liquibase 迁移脚本规范。
全书小结与自测
① 三家各有家脾气:MySQL 简单快、生态大;Oracle 贵稳强、PL/SQL + RAC;PostgreSQL 标准全、扩展强、pgvector 适合 AI。
② 通用内功三家都通:SQL(DDL/DML/DQL/JOIN/子查询/聚合)、索引与 EXPLAIN、事务与 ACID、备份恢复、主从复制。
③ 选型别纠结:业务简单快速上线选 MySQL;金融核心选 Oracle;要 GIS/向量/复杂查询选 PostgreSQL。
④ 动手比看重要:挑一家(建议 MySQL),用 Docker 起一个库,把本章所有 SQL 自己敲一遍,错几次就全懂了。
自测 5 道题(折叠看答案)
1.(概念题)为什么说"索引就是书的目录"?索引有什么代价?
查看答案
答案:索引让数据库不用全表扫描就能定位行,像目录直接翻到页码。但索引要占磁盘空间,而且每次 INSERT/UPDATE/DELETE 都要同步维护索引,写越多、索引越多,写入越慢。所以索引不是越多越好,只为高频查询列建。
2.(事务题)转账:A 扣 100、B 加 100。中间数据库崩了,事务靠什么保证钱不丢?
查看答案
答案:靠事务的原子性——没 COMMIT 就不算数,崩溃后回滚到事务开始前。持久性靠 redo log 落盘,COMMIT 后就算断电也能恢复。
3.(SQL 题)SELECT * FROM t WHERE name LIKE '%张%' 为什么走不了 name 上的普通索引?怎么优化?
查看答案
答案:前导通配符 % 让 B+ 树无法按前缀定位。优化:用全文索引(MySQL FULLTEXT / PG GIN + 分词),或把这种搜索挪到 Elasticsearch 等专门搜索引擎。
4.(选型题)你要做一个"附近的人"功能,按经纬度找半径 5 公里内的用户,三家里哪家最顺手?
查看答案
答案:PostgreSQL + PostGIS,原生支持几何类型和空间索引(GiST),空间查询函数齐全。MySQL 也有空间类型但生态远不如 PostGIS。
5.(运维题)线上库早上发现昨晚有人误 DELETE 了一张表的数据,你有全量备份和持续的 binlog/WAL,怎么恢复?
查看答案
答案:先恢复最近一次全量备份,再重放 binlog/WAL 到误操作前的时刻(PITR 时间点恢复)。所以"全量 + 持续归档日志"是能救命的标准配置——没归档日志就只能恢复到上次全量,中间数据全丢。
进阶学习路线
| 阶段 | 学什么 |
|---|---|
| 入门(已完成) | 装环境、写 SQL、建索引、懂事务。 |
| 进阶 | 主从复制、读写分离、慢 SQL 调优、备份恢复演练。 |
| 深入 | 内核原理(B+树、MVCC、WAL)、分库分表、分布式事务。 |
| 专精 | 选一家深入:MySQL InnoDB 内幕 / Oracle OCP / PostgreSQL 源码与扩展开发。 |
① 把本章 MySQL 章节的 SQL 在自己 Docker 里敲一遍,再故意写几条慢 SQL 用 EXPLAIN 看效果。
② 想搞 AI/RAG,就装个 PostgreSQL + pgvector,把你自己的文档向量化存进去跑一次检索。
③ 数据库是后端的半壁江山,和前面学的 Node.js、Redis 串起来,你就有完整的后端栈了。
附:数据库性能优化总清单
| 层 | 检查点 |
|---|---|
| SQL 层 | EXPLAIN 看有没有全表扫、是否走对索引、是否回表、是否 filesort。 |
| 索引层 | 高频查询列建索引、联合索引最左前缀、覆盖索引、删掉无用索引。 |
| 表设计层 | 大表分区/分表、避免 SELECT *、控制单行宽度。 |
| 架构层 | Redis 缓存热点、读写分离、连接池、限流。 |
| 资源层 | CPU/IO/内存是否打满、锁等待、主从延迟。 |
附:一张能直接背的三库命令速查卡
换库最容易犯的就是"按上一家的肌肉记忆敲命令"。下面这张卡把三家最常敲的对一下,存手机里随时翻。
| 要做的事 | MySQL | Oracle | PostgreSQL |
|---|---|---|---|
| 看当前库 | SELECT DATABASE(); | SELECT name FROM V$DATABASE; | SELECT current_database(); |
| 看所有表 | SHOW TABLES; | SELECT * FROM USER_TABLES; | \dt |
| 看表结构 | DESC 表名; | DESC 表名 | \d 表名 |
| 看执行计划 | EXPLAIN SQL | EXPLAIN PLAN FOR ... | EXPLAIN ANALYZE SQL |
| 当前连接数 | SHOW PROCESSLIST; | SELECT * FROM V$SESSION; | SELECT * FROM pg_stat_activity; |
| 建索引 | CREATE INDEX ... ON 表(列); | 同左 | 同左(可选 USING gin/btree) |
| 统计分析 | ANALYZE TABLE 表; | DBMS_STATS.GATHER_TABLE_STATS | ANALYZE 表; |
别真去背这张表。用得最多的是"看执行计划"和"看慢在哪"——只要养成"一慢就先 EXPLAIN"的肌肉记忆,其他命令用到时查就行。数据库这东西,熟手和新手的差别不在记了多少命令,而在遇到慢时知道从哪下手。
另外提醒:命令行客户端三家各有快捷键,mysql 用 source 文件 执行脚本,psql 用 \i 文件,sqlplus 用 @文件。这三个记混了会浪费一晚上。
到这里,数据库三剑客这本"小书"就翻完了。下一步只剩一件事:打开终端,敲第一条 SQL。
别光收藏——动手的那一刻,知识才算真正长在你身上。