一文入门 MySQL + MongoDB + Redis:关系型、文档型、键值型三箭齐发,搞定90%的后端存储场景
发布时间:2026/9/6 5:01:13 作者:尧图编辑部 阅读量:1,286

摘要本文系统梳理后端开发中最常用的三款数据库——MySQL、MongoDB 和 Redis 的定位与分工。MySQL 作为关系型数据库的王者以 ACID 事务和 SQL 查询保障核心业务的数据一致性与强关联分析MongoDB 凭借 BSON 文档模型和 Schema-less 特性灵活应对字段多变、快速迭代的非结构化数据场景Redis 则依托内存存储与丰富的数据结构为高并发场景提供毫秒级缓存与排行榜等能力。文章通过概念对比、代码示例和实战场景帮助读者快速建立选型思路用三款数据库各司其职、配合使用覆盖绝大多数后端存储需求。引言你的数据该往哪儿放想象一下这个场景你正在开发一款社交App今天有三个需求摆在面前——用户注册登录需要严格保证账户信息和密码的安全绝不允许数据错乱。用户行为日志每天产生海量的点击流数据字段多、结构不固定存什么格式都行。热门话题排行榜要求毫秒级响应高并发下扛住千万用户的实时刷榜。如果让你只用一种数据库来扛这三个活儿要么性能崩盘要么开发痛苦到怀疑人生。没有一种数据库能完美适配所有场景这就是为什么我们需要掌握多种数据库的定位。本文带你一次性理清三员大将的分工MySQL —— 定海神针。管的是“关系”存的是“钱”。它稳如泰山确保每一笔交易都分毫不差。MongoDB —— 灵活百变。管的是“文档”存的是“货”。它像乐高积木怎么拼都行最适合快速试错。Redis —— 闪电侠。管的是“缓存”跑的是“速”。它快到飞起专门解决高并发的性能瓶颈。一句话帮你刻在脑子里MySQL管“关系”MongoDB管“文档”Redis管“缓存”。下面我们逐一拆解。第一部分MySQL —— 关系型数据库的王者如果你只能学一种数据库那一定是MySQL。它从1995年诞生至今已经统治了互联网行业二十余年。无论是Facebook、Twitter还是绝大多数的创业公司MySQL都是核心业务的首选。1.1 核心概念为什么叫“关系型”关系型数据库的核心思想是数据以二维表Table的形式存储表与表之间可以建立关联。你可以把它想象成一个结构严谨的Excel表格每一行是一条记录每一列是一个字段。术语含义通俗解释表Table数据的容器相当于一个Excel Sheet行/记录Row一条具体的数据表格中的一行列/字段Column数据的一个属性表格中的一列如 name, age主键Primary Key唯一标识一条记录的字段每个人的身份证号不可重复外键Foreign Key指向另一张表主键的字段订单表中的 user_id 指向用户表的 id索引Index用于加速查询的数据结构书的目录让你不用翻遍全书ACID 原则MySQL 的灵魂谈到关系型数据库就绕不开 ACID。这是面试必考题也是MySQL能成为“定海神针”的根本原因。特性含义通俗解释原子性A事务中的所有操作要么全部成功要么全部回滚银行转账扣你钱和加他钱必须同时完成不能只扣一半一致性C事务前后数据必须保持逻辑上的正确转账前后双方总金额不变隔离性I多个事务并发执行时互不干扰你在柜台取钱不影响ATM机同时查询你的余额持久性D事务一旦提交数据永久保存转账成功后即使立刻断电钱也不会消失1.2 SQL 语言的四大金刚SQLStructured Query Language是与MySQL交互的语言。我们把它分成四类其中DQL查询是你用得最多的。查DQL—— 重中之重-- 查询 users 表中年龄大于18岁的用户按创建时间倒序排列 SELECT * FROM users WHERE age 18 ORDER BY create_time DESC;SELECT 的威力在于它能把多张表关联起来-- 查询订单及其对应的用户名Join 操作 SELECT orders.id, users.name, orders.amount FROM orders JOIN users ON orders.user_id users.id;增DMLINSERT INTO users (name, age, email) VALUES (Tom, 25, tomexample.com);改DML-- ⚠️ 危险警告忘记 WHERE 条件你会更新全表数据 UPDATE users SET age 26 WHERE id 1;删DMLDELETE FROM users WHERE id 1;存储引擎InnoDB 与 MyISAM存储引擎是MySQL负责数据读写的那套底层机制。最核心的是两个引擎InnoDBMyISAM事务✅ 支持❌ 不支持行级锁✅ 支持高并发下性能更好❌ 仅支持表锁并发写入性能差外键✅ 支持❌ 不支持适用场景绝大多数业务系统读多写少的静态数据仓库从MySQL 5.5开始默认引擎就是 InnoDB。除非有特别极端的读多写少场景否则请一直使用InnoDB。1.3 使用场景✅强一致性核心业务用户账户、订单、支付、商品库存。✅需要复杂关联查询的场景比如生成月度报表需要关联用户、订单、产品等多张表。❌不适合海量非结构化日志字段频繁变动用MySQL维护表结构会痛苦不堪。第二部分MongoDB —— 文档型数据库的革新者当你的数据字段千变万化、不确定未来会怎么扩张时用MySQL强行建模就是一场灾难。这时候MongoDB 登场了。2.1 核心概念对比学习理解MongoDB最简单的方式就是把它和MySQL做个对比MySQLMongoDB通俗解释数据库Database数据库Database完全一样表Table集合Collection相当于一个“数组”里面放了很多文档行Row文档Document相当于一个 JSON 对象如 {name: Tom}列Column字段FieldJSON对象里的一个键值对2.2 BSON 与 Schema-lessMongoDB存储数据使用的格式叫 BSONBinary JSON本质上就是二进制化的JSON。它最大的特性是 Schema-less无模式同一张集合下的文档可以拥有完全不同的字段结构。// 文档A用户Tom有昵称和标签 { name: Tom, nickname: T-Mac, tags: [basketball, tech] } // 文档B用户Jerry比Tom多了一个手机号字段少了一个标签字段 { name: Jerry, email: jerryme.com, phone: 13800138000 }这两条文档可以在同一个 users 集合里共存。这种灵活性让迭代开发变得极快但要注意在项目团队里我们通常还是人为约定好字段结构否则会给后面维护的人带来巨大麻烦。基本操作示例// 插入一条文档 db.users.insertOne({ name: Tom, age: 25, tags: [cool, tech] }); // 查询年龄大于18的用户注意语法 db.users.find({ age: { $gt: 18 } }); // 更新 db.users.updateOne( { name: Tom }, { $set: { age: 26 } } ); // 删除 db.users.deleteOne({ name: Tom });2.3 使用场景✅内容管理系统文章、评论、标签结构多变。✅日志与物联网数据传感器每次上报的字段可能都不一样。✅快速迭代的创业项目不需要停机执行 ALTER TABLE 来加字段。❌不适合多表关联事务MongoDB 4.0之后支持多文档事务但性能远不如MySQL。如果你的核心业务涉及金额请出门左转找MySQL。第三部分Redis —— 内存中的性能怪兽如果说MySQL和MongoDB是“硬盘上的仓库”那Redis就是“内存中的高速缓存”。它的核心使命只有一个字快。3.1 为什么这么快基于内存数据全在RAM里读写速度是机械硬盘的几十万倍实测QPS轻松破10万。单线程模型核心命令执行Redis的服务端核心命令处理采用单线程避免了多线程的上下文切换和锁竞争开销这是它能达到极致性能的关键原因。需要注意的是较新版本的Redis在网络IO处理上已引入多线程但核心执行逻辑仍是单线程的。重要警示因为数据在内存里断电即失。所以Redis通常被当作缓存来用而不是主存储——除非你愿意接受丢数据的风险虽然有持久化方案。3.2 五种常用数据结构这是Redis最值得学的部分。选择正确的数据结构能让你的代码效率翻倍。数据结构命令示例适用场景String字符串SET verify:123 7890 EX 60短信验证码、分布式锁、计数器Hash哈希HSET user:1 name Tom age 25存储对象用户信息、商品信息List列表LPUSH notifications new message消息队列、最新动态列表Set集合SADD lottery:today userA抽奖池、共同好友交集运算Sorted Set有序集合ZADD rank 100 userA排行榜热门话题、游戏榜单排行榜的杀手级应用# 添加用户分数 ZADD leaderboard 1000 Alice ZADD leaderboard 950 Bob 获取前三名 ZREVRANGE leaderboard 0 2 WITHSCORES 输出1) Alice 2) 1000 3) Bob 4) 950就这一行命令如果用MySQL来做需要 ORDER BY score DESC LIMIT 3 加上维护索引在高并发下性能远不及Redis毫秒级响应。3.3 持久化策略RDB vs AOFRedis虽然跑在内存里但它提供了两种方式把数据备份到硬盘以防重启后数据全部丢失。持久化方式RDB快照AOF日志原理定期把内存数据全量写入一个.rdb文件把每条写命令追加到.aof日志文件中优点恢复速度极快文件小数据更安全最多丢失一秒数据缺点两次快照之间若宕机数据会丢失文件巨大恢复速度慢最佳实践两者结合使用Redis 4.0 支持混合持久化兼顾安全与恢复效率3.4 缓存三兄弟⚠️ 重点警惕用Redis做缓存时有三个经典坑是你迟早会遇到的。提前了解能让你少熬几个通宵。问题定义解决方案缓存穿透查询一个根本不存在的数据每次请求都直接打到数据库布隆过滤器或缓存空值null并设置短期过期缓存击穿一个热点Key正好过期瞬间大量并发请求直接打爆数据库互斥锁只让一个线程去查DB其他线程等待缓存雪崩大量Key在同一时间同时过期导致数据库压力骤增过期时间添加随机偏移量如 60 random(0,10) 秒结语与选型建议学完这三款数据库你手里已经有了三把不同的兵器。关键在于——什么场景用什么刀。一句话总结MySQL管“关系”MongoDB管“文档”Redis管“缓存”。三者各司其职、配合使用就能覆盖绝大多数后端存储场景。