【数据库】技术栈全景——7 种数据库一句话定位与选型决策
写后端不可能绕过数据库。MySQL、PostgreSQL、MongoDB、Redis、Elasticsearch、SQLite、IndexedDB——面对这么多选择,该怎么选?这篇文章帮你建立数据库的”全景地图”。
一、为什么要认识这么多数据库
刚开始学后端的时候,我以为数据库就是 MySQL——会写 CRUD,会建表,就够了。后来真正开始做项目,才发现不是这么回事。
一个典型的 Web 应用,背后可能同时跑着好几种数据库:
MySQL → 存储订单、用户、商品 (业务数据)Redis → 缓存热点数据、Session(性能)ES → 商品搜索、日志检索 (搜索)MongoDB → 用户行为日志 (灵活写入)不是”用一个替换另一个”,是”组合使用”——每种都在做它最擅长的事。
这就是为什么要认识这么多数据库。不是为了全部精通,是为了知道什么时候该用哪个。
二、7 种数据库一句话定位
先建立全景,再深入细节。
| 数据库 | 一句话定位 | 核心场景 |
|---|---|---|
| MySQL | 最成熟的开源关系型 | Web 应用首选,中小项目 |
| PostgreSQL | 最先进的开源关系型 | 复杂查询、数据分析、需要强 SQL 标准 |
| SQLite | 嵌入式文件数据库 | 移动端、桌面应用、本地工具 |
| MongoDB | 文档型 NoSQL | Schema 灵活、JSON 数据、快速迭代 |
| Redis | 内存数据结构服务器 | 缓存、排行榜、实时计数、Session |
| Elasticsearch | 分布式搜索引擎 | 全文搜索、日志分析、RAG 语义检索 |
| IndexedDB | 浏览器端数据库 | PWA、离线 Web 应用 |
这张表先记住,后面每一种都会展开说。
三、关系型 vs 非关系型:先把这个想清楚
学数据库绕不开这个分类。但我发现很多人背了定义,却没真正想清楚区别在哪里、为什么会有这个区别。
关系型数据库(MySQL / PostgreSQL / SQLite)
关系型数据库的核心,是**“表”**。
数据存在表里,每张表有固定的列(字段),每一行是一条记录。表和表之间通过外键关联。
用户表(users)┌────┬──────────┬───────────────────┐│ id │ name │ email │├────┼──────────┼───────────────────┤│ 1 │ 昇哥 │ sheng@example.com ││ 2 │ 小明 │ ming@example.com │└────┴──────────┴───────────────────┘
订单表(orders)┌────┬─────────┬──────────┬────────┐│ id │ user_id │ product │ amount │├────┼─────────┼──────────┼────────┤│ 1 │ 1 │ 汉服 │ 299.00 ││ 2 │ 1 │ 茶叶 │ 88.00 │└────┴─────────┴──────────┴────────┘orders.user_id 指向 users.id——这就是”关系”。
关系型数据库的三个核心优势:
- 结构固定:Schema 先定好,数据按格式写进来,不会乱
- 事务保证(ACID):这个后面单独说,是关系型数据库最重要的特性
- 查询能力强:SQL 可以做复杂的 JOIN、聚合、子查询
适合什么场景?
“数据不能出错”的场景——订单系统、财务系统、用户系统。
你不希望一笔钱扣了但订单没建上,也不希望用户表里突然多了一列莫名其妙的字段。关系型数据库的约束,正是为了防止这些事发生。
非关系型数据库(MongoDB / Redis / ES)
非关系型数据库(NoSQL)不是一种数据库,是一类数据库的统称。
它们的共同点:不用表来组织数据,Schema 灵活,各有专长。
MongoDB(文档型):数据是 JSON 文档{ "_id": "xxx", "user": "昇哥", "actions": ["点赞", "收藏", "分享"], "device": { "type": "mobile", "os": "iOS" }}
Redis(键值型):数据是 key-value"session:abc123" → { userId: 1, role: "admin" }"rank:weekly" → [昇哥:9800, 小明:8800, ...]
Elasticsearch(搜索型):数据是可检索的文档全文搜索"汉服" → 返回相关度排序的结果列表非关系型数据库的三个核心优势:
- Schema 灵活:不需要提前定好表结构,字段可以随时增减
- 水平扩展好:天然支持分布式,数据量大了可以横向加机器
- 特定场景性能极高:Redis 的缓存、ES 的搜索,在各自场景下远超关系型
适合什么场景?
各有专长——Redis 做缓存,ES 做搜索,MongoDB 存灵活的 JSON 数据。不是”替代”关系型,是”补充”关系型。
一句话总结这个区别
关系型:结构严格,数据可靠,查询灵活——适合”核心业务数据”。 非关系型:各有专长,灵活扩展——适合”特定场景的性能需求”。
四、ACID 是什么——关系型数据库最重要的保证
学关系型数据库,ACID 是绕不开的概念。
ACID 是四个英文单词的缩写,代表数据库事务的四个保证:
A — Atomicity(原子性)
一个事务里的所有操作,要么全部成功,要么全部失败。
最经典的例子:转账。
昇哥账户 -100 元小明账户 +100 元这两步必须同时成功,或者同时不发生。不能出现”昇哥扣了钱,但小明没收到”的情况。
原子性保证了这一点——如果第二步失败了,第一步会自动回滚。
C — Consistency(一致性)
事务执行前后,数据库必须处于合法状态。
比如账户余额不能为负数,这是一个约束。一致性保证任何事务执行完之后,这个约束依然成立。
一致性是建立在原子性、隔离性、持久性之上的——其他三个保证了,一致性自然成立。
I — Isolation(隔离性)
多个事务并发执行时,互相不干扰。
这是 ACID 里最复杂的一个,也是面试最爱考的。
想象两个用户同时抢最后一件商品:
事务 A:查询库存 → 库存=1 → 下单 → 库存-1事务 B:查询库存 → 库存=1 → 下单 → 库存-1如果没有隔离性,两个事务都看到库存=1,都下单成功,库存变成 -1——超卖了。
隔离性通过锁机制和隔离级别来保证,这个后面会单独写一篇深入讲。
D — Durability(持久性)
事务一旦提交,数据就永久保存,不会因为宕机丢失。
数据库通过 WAL(Write-Ahead Log,预写日志)来保证这一点——先把操作写进日志,再写进数据文件。即使中途断电,重启后也能从日志恢复。
为什么 NoSQL 通常不保证完整的 ACID?
因为 ACID 是有代价的——加锁、写日志、回滚,都会降低性能。
NoSQL 的设计取舍是:放弃部分一致性保证,换取更高的吞吐量和更好的扩展性。
Redis 有有限的事务支持(Lua 脚本),MongoDB 4.0 之后支持多文档事务,但都不如关系型数据库完整。这不是缺点,是设计选择——用在对的场景就好。
五、多维对比表
有了前面的基础,这张表看起来就不只是数字了:
| 维度 | MySQL | PostgreSQL | SQLite | MongoDB | Redis | ES |
|---|---|---|---|---|---|---|
| 类型 | 关系型 | 关系型 | 嵌入式 | 文档型 | 内存键值 | 搜索引擎 |
| SQL 标准 | 中等 | 最高 | 中高 | 自有 QL | 自有命令 | Query DSL |
| 事务 | ACID | ACID | ACID | 4.0+ | 有限(Lua) | 无 |
| 索引 | B-Tree | B-Tree/Hash/GiST/GIN | B-Tree | B-Tree/Text/Geo | 内存直访 | 倒排索引 |
| 扩展 | 主从/分片 | 流复制 | 无 | 副本集/分片 | 主从/集群 | 天然分布式 |
| 学习曲线 | 中 | 中高 | 低 | 中 | 低入高精 | 中高 |
| 典型 QPS | 1k-100k | 1k-100k | 1-1k | 1k-100k | 100k-1M | 1k-100k |
Redis 的 QPS 为什么能到 100k-1M?因为数据在内存里,不需要磁盘 I/O。 ES 为什么用倒排索引?因为全文搜索需要”从词找文档”,倒排索引正是为此设计的。
六、每种数据库适合什么——展开说
MySQL:最成熟的选择
MySQL 是全球使用最广泛的开源关系型数据库。
适合: 中小型 Web 应用、团队已有 MySQL 经验、需要大量读操作的场景。
不适合: 复杂的分析查询、需要 JSONB 或地理空间数据、对 SQL 标准要求极高的场景。
一个真实的坑: MySQL 默认的隔离级别是 Repeatable Read,在某些场景下会有幻读问题。如果业务对数据一致性要求很高,需要显式设置隔离级别或者换 PostgreSQL。
PostgreSQL:更”正道”的选择
PostgreSQL 是 SQL 标准兼容性最强的开源数据库,功能比 MySQL 丰富得多。
适合: 复杂查询(窗口函数、CTE、递归查询)、数据完整性要求极高、需要 JSONB / 地理空间 / 全文搜索等高级类型、AI 项目(pgvector 向量检索)。
不适合: 团队完全没有 PG 经验且项目简单、需要 AWS Aurora 等 MySQL 兼容的托管服务。
一个真实的感受: 学了 PG 的 SQL 标准写法,再看 MySQL 的差异,只是几个语法不同。反过来,习惯了 MySQL 的宽松模式,转到 PG 会有”为什么不让我这么写”的挫败感。这个坑,踩过才知道。
SQLite:被低估的数据库
SQLite 不需要服务器,整个数据库就是一个文件。
适合: 移动端应用(iOS/Android 内置)、桌面工具、本地开发环境、不需要并发写入的小型应用。
不适合: 高并发写入、多进程同时访问、需要网络访问的服务端场景。
一个没想到的用法: 很多 AI 工具的本地存储用的就是 SQLite——轻量、零配置、够用。
MongoDB:Schema 灵活的代价
MongoDB 存的是 JSON 文档,不需要提前定义表结构。
适合: 数据结构经常变化的早期项目、存储用户行为日志、内容管理系统(文章、评论结构复杂)。
不适合: 需要复杂关联查询、需要强事务保证的核心业务数据。
一个常见误区: “Schema 灵活”不是优点,是取舍。灵活意味着约束少,约束少意味着数据容易乱。用 MongoDB 存核心业务数据,后期维护会很痛苦。
Redis:不只是缓存
很多人以为 Redis 就是”缓存数据库”。其实 Redis 是内存数据结构服务器,支持字符串、哈希、列表、集合、有序集合等多种数据结构。
适合:
- 缓存(热点数据、数据库查询结果)
- Session 存储
- 排行榜(有序集合天然支持)
- 实时计数(文章阅读数、点赞数)
- 分布式锁
- 消息队列(简单场景)
不适合: 存储需要持久化的核心业务数据(内存有限,重启有风险)。
一个关键认知: Redis 的高性能来自内存,但内存是有限的。用 Redis 做缓存,一定要设置过期时间(TTL),否则内存会被撑爆。
Elasticsearch:搜索引擎,不只是数据库
ES 的核心是倒排索引——把文档里的每个词,映射到包含这个词的文档列表。
这让它能在海量文档里做毫秒级的全文搜索,这是 MySQL 的 LIKE 查询根本做不到的。
适合:
- 全文搜索(商品搜索、文章搜索)
- 日志分析(ELK Stack:Elasticsearch + Logstash + Kibana)
- RAG 知识库的语义检索(结合向量搜索)
不适合: 存储需要事务保证的业务数据、频繁更新的数据(ES 更新代价高)。
一个真实的用法: 在 AI / RAG 项目里,ES 可以做混合检索——关键词匹配 + 向量相似度,两路结合,比单纯向量检索效果更好。
IndexedDB:前端开发者的数据库
IndexedDB 是浏览器内置的数据库,运行在客户端,数据存在用户本地。
适合: PWA(渐进式 Web 应用)、离线可用的 Web 应用、需要在浏览器端缓存大量数据的场景。
不适合: 服务端数据存储(它只在浏览器里)。
一个实际感受: IndexedDB 的 API 设计比较底层,直接用很繁琐。实际项目里通常用 Dexie.js 这类封装库。
七、选型决策树
需要什么?│├─ 需要可靠的事务存储(订单、财务、用户)│ ├─ 数据量大且查询复杂 → PostgreSQL│ └─ 常规 Web、团队熟悉 → MySQL│├─ 本地工具、移动端、嵌入式应用│ └─ SQLite│├─ Schema 灵活、JSON 数据、快速迭代│ └─ MongoDB│├─ 缓存、Session、排行榜、实时计数│ └─ Redis│├─ 全文搜索、日志分析、RAG 检索│ └─ Elasticsearch│├─ 浏览器端离线存储、PWA│ └─ IndexedDB│└─ 需要多个? └─ 组合使用(常态!)八、经典技术组合
| 场景 | 组合方案 | 逻辑 |
|---|---|---|
| 中小型 Web | MySQL + Redis | MySQL 存业务数据,Redis 扛热点缓存 |
| 内容/社区 | PostgreSQL + Redis + MongoDB | PG 存核心数据,Redis 缓存,Mongo 存行为日志 |
| AI / RAG 知识库 | PostgreSQL + ES + Redis | PG 存结构化数据,ES 做语义检索,Redis 缓存结果 |
| 离线桌面应用 | SQLite | 零配置,一个文件搞定 |
| 离线 Web / PWA | IndexedDB + Cache API | 浏览器端完整离线方案 |
| 实时分析/监控 | Elasticsearch + Redis | ES 存日志,Redis 做实时聚合 |
九、GUI 工具一览
每个数据库都有对应的可视化工具,在学习阶段强烈建议使用 GUI——能直观看到表结构、索引、查询计划。
| 数据库 | GUI 工具 | 说明 |
|---|---|---|
| MySQL | MySQL Workbench | 官方工具,ER 图、查询计划、Server Status |
| PostgreSQL | pgAdmin 4 | 官方工具,Query Tool、Dashboard 监控 |
| SQLite | DB Browser for SQLite | 轻量开源,浏览数据+执行 SQL |
| MongoDB | MongoDB Compass | 官方工具,聚合管道可视化分析 |
| Redis | RedisInsight | 官方工具,内存分析、慢查询 |
| Elasticsearch | Kibana | 官方工具,Dev Tools 写 Query DSL |
这些 GUI 工具不只是”执行 SQL 的地方”——用它们的 Table Inspector、Explain Plan、聚合管道分析器,能可视化地理解数据结构,比纯命令行效率高得多。学习阶段,能用 GUI 就用 GUI,别硬刚命令行。
十、学习路线建议
1. 先学透一个关系型(推荐 PostgreSQL) → 熟练 CRUD + 索引原理 + 事务隔离 + 慢查询优化 → 把 ACID 真正搞懂,不只是背定义
2. 再加 Redis → 缓存是性能优化的核心手段,面试必考 → 重点:缓存穿透 / 缓存雪崩 / 缓存击穿 的处理方式
3. 按需扩展 → Schema 灵活 → MongoDB → 全文搜索 / RAG → ES → 本地工具 → SQLite
4. 别同时学三四个 → 概念会串,先深后广 → 一个学透了,再看下一个,会快很多写在最后
数据库是后端工程师最重要的硬技能。不是”会用 SQL 写 CRUD 就行”——理解索引为什么能加速查询、事务隔离级别如何影响并发、锁机制怎么保护数据一致性,才能写出高性能的系统。
这些概念,光看定义记不住。得结合场景,踩过坑,才会真的懂。
下一篇深入这些核心概念:数据库核心概念——索引 / 事务 / 锁 / 范式。
昇哥 · 2026年5月 学数据库技术栈途中,顺手把想清楚的事写下来。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!