MySQL + MongoDB + Redis 三位一体:从理论到实战的完全指南 第一部分读懂三者的定位在学习具体命令之前先搞清楚一个核心问题它们分别解决什么问题关系型与非关系型两种不同的哲学这个分野决定了三者的根本差异。关系型数据库以MySQL为代表核心特征严格的结构化二维表必须预先定义Schema表结构字段类型固定。事务保障全面支持ACID原则原子性、一致性、隔离性、持久性提供强一致性保障。这在金融交易、订单系统这类场景中不可替代。扩展方式以垂直扩展为主——升级服务器的CPU、内存、硬盘来提升性能扩展能力有限。非关系型数据库以MongoDB和Redis为代表核心特征无Schema或动态Schema支持非结构化、半结构化数据存储形式灵活多样。事务保障大多遵循BASE理论基本可用、软状态、最终一致性牺牲部分强一致性换取更高的读写性能和扩展性。扩展方式以水平扩展为主——通过增加服务器节点实现集群扩容能轻松应对海量数据。三者的定位对比特征MySQLMongoDBRedis类型关系型SQLNoSQL文档型NoSQL键值型数据模型严格结构化二维表灵活JSON/BSON文档键值对 多种数据结构核心优势可靠、强一致、复杂关联查询灵活Schema、水平扩展、开发效率高极速内存级、丰富数据结构典型场景Web应用、电商订单、CMS内容管理、用户画像、快速迭代MVP缓存、会话管理、实时排行榜、消息队列第二部分MySQL——可靠的关系型数据库主力MySQL是互联网Web应用的标配尤其搭配InnoDB引擎时支持事务和高并发经受了大规模实战考验。登录与连接# 连接到本机MySQL mysql -u root -p # 连接到远程服务器-h指定主机-P指定端口 mysql -h 192.168.1.100 -P 3306 -u root -p # 退出 exit; -- 或 quit;新手血泪教训MySQL的所有命令都必须以英文分号;结尾忘记分号命令就会一直悬着不执行。DDL数据定义语言定义结构-- 查看所有数据库 SHOW DATABASES; -- 创建数据库强烈建议指定字符集避免中文乱码 CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 切换数据库 USE mydb; -- 删除数据库谨慎操作 DROP DATABASE mydb; -- 查看当前数据库所有表 SHOW TABLES; -- 创建表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键 username VARCHAR(50) NOT NULL, -- 用户名不能为空 email VARCHAR(100) UNIQUE, -- 邮箱唯一约束 created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 查看表结构非常实用 DESCRIBE users; -- 或简写 DESC users; -- 删除表 DROP TABLE users; -- 添加表列 ALTER TABLE users ADD age INT; -- 删除表列 ALTER TABLE users DROP age;DML数据操作语言操作数据-- 插入数据增 INSERT INTO users (username, email) VALUES (jack, jackexample.com); -- 如果id自增可以省略id字段 -- 查询数据查 SELECT * FROM users; -- 查询所有字段生产环境慎用 SELECT username, email FROM users; -- 只查特定列 SELECT * FROM users WHERE id 1; -- 带条件查询 -- 更新数据改 UPDATE users SET email newexample.com WHERE id 1; -- ⚠️ 血泪教训务必写WHERE条件否则会更新整张表 -- 删除数据删 DELETE FROM users WHERE id 1; -- ⚠️ 同样没有WHERE条件会清空整张表用户与权限管理-- 创建用户并授权让新用户对mydb所有表拥有所有权限 GRANT ALL PRIVILEGES ON mydb.* TO jacklocalhost IDENTIFIED BY password123; -- 刷新权限使生效 FLUSH PRIVILEGES; -- 查看用户权限 SHOW GRANTS FOR jacklocalhost;数据导入导出# 导出整个数据库 mysqldump -u root -p mydb mydb_backup.sql # 导入SQL文件 mysql -u root -p mydb mydb_backup.sql # 或在mysql命令行中执行 source /path/to/mydb_backup.sql;第三部分MongoDB——灵活的文档型数据库MongoDB使用BSON二进制JSON格式存储数据以文档Document为单位组织在集合Collection中没有强制的Schema约束非常适合数据模型频繁变化的场景。连接与基础操作# 启动MongoDB Shell默认连接localhost:27017 mongo # 查看所有数据库 show dbs # 切换/创建数据库use一个不存在的数据库插入数据后会自动创建 use mydb # 查看当前数据库 db # 删除当前数据库 db.dropDatabase() # 查看当前数据库所有集合 show collections # 或 show tables核心区别MongoDB没有创建数据库的专门命令——use一个不存在的数据库然后插入第一条数据数据库就自动诞生了。CRUD操作插入文档// 插入单条文档如果集合不存在会自动创建 db.users.insertOne({ name: Jack, age: 28, email: jackexample.com, address: { city: Beijing, street: Changan Ave }, hobbies: [reading, coding] }); // 批量插入多条文档 db.users.insertMany([ { name: Rose, age: 25, email: roseexample.com }, { name: Tom, age: 30, email: tomexample.com } ]);优势体现同一个集合里不同文档可以有完全不同的字段结构——这在MySQL中需要通过ALTER TABLE才能实现而MongoDB完全不需要。查询文档// 查询所有文档 db.users.find() // 按条件查询 db.users.find({ name: Jack }) // 查询第一条匹配的文档 db.users.findOne({ name: Jack }) // 投影查询只返回指定字段1包含0排除 db.users.find({ age: { $gt: 25 } }, { name: 1, email: 1, _id: 0 }) // 条件查询示例 db.users.find({ age: { $gte: 18, $lte: 60 } }) // 年龄在18-60之间 db.users.find({ hobbies: { $in: [reading] } }) // 爱好包含reading更新文档// 更新单条$set只更新指定字段不影响其他字段 db.users.updateOne( { name: Jack }, { $set: { age: 29, address.city: Shanghai } } ); // 更新多条 db.users.updateMany( { age: { $lt: 18 } }, { $set: { status: minor } } ); // 替换整个文档 db.users.replaceOne( { name: Jack }, { name: Jack, age: 29, email: jack_newexample.com } );删除文档// 删除单条 db.users.deleteOne({ name: Tom }); // 删除多条 db.users.deleteMany({ age: { $lt: 18 } }); // 删除所有文档但保留集合 db.users.deleteMany({});索引管理索引是保证查询性能的关键MongoDB默认在_id字段上有索引。// 创建单字段索引升序1降序-1 db.users.createIndex({ email: 1 }); // 创建唯一索引确保email不重复 db.users.createIndex({ email: 1 }, { unique: true }); // 查看集合的所有索引 db.users.getIndexes(); // 删除索引 db.users.dropIndex(email_1); // 创建复合索引 db.users.createIndex({ age: 1, name: -1 });聚合与统计// 统计文档数量 db.users.countDocuments() db.users.countDocuments({ age: { $gt: 20 } }) // 分页查询skip跳过limit限制 db.users.find().skip(10).limit(5) // 第3页每页5条 // 排序1升序-1降序 db.users.find().sort({ age: -1 }) // 聚合管道示例按城市分组统计人数 db.users.aggregate([ { $group: { _id: $address.city, count: { $sum: 1 } } }, { $sort: { count: -1 } } ]);第四部分Redis——内存中的速度之王RedisRemote Dictionary Server是一个基于键值对的内存数据结构存储系统。它把整个数据集保存在RAM中这是其惊人性能的秘诀。在架构上Redis是单线程的使用事件循环处理请求高效管理并发客户端而无需多线程开销。连接与基础操作# 启动Redis客户端默认localhost:6379 redis-cli # 连接远程Redis redis-cli -h 192.168.1.100 -p 6379 # 认证如果设置了密码 AUTH yourpassword # 查看服务器信息 INFO # 查看所有键生产环境慎用数据量大时性能差 KEYS * # 切换到指定数据库默认16个编号0-15 SELECT 1 # 查看当前数据库的键数量 DBSIZE # 清空当前数据库 FLUSHDB # 清空所有数据库 FLUSHALL五种核心数据结构Redis真正的强大之处在于它不仅仅是key-value而是支持多种数据结构。1. 字符串String——最基础# 设置键值 SET name Jack # 获取值 GET name # 返回 Jack # 设置过期时间秒 SET session abc123 EX 3600 # 数值操作如果值是数字 SET counter 10 INCR counter # 返回 11 DECR counter # 返回 10 INCRBY counter 5 # 返回 152. 哈希Hash——适合存储对象# 设置哈希字段 HSET user:1001 name Jack age 28 email jackexample.com # 获取单个字段 HGET user:1001 name # 返回 Jack # 获取所有字段和值 HGETALL user:1001 # 返回 name, Jack, age, 28, email, jackexample.com # 同时获取多个字段 HMGET user:1001 name age # 返回 Jack, 28 # 判断字段是否存在 HEXISTS user:1001 age # 返回 1存在 # 删除字段 HDEL user:1001 email3. 列表List——有序可重复适合队列# 从左侧头部推入 LPUSH queue task1 LPUSH queue task2 # 从右侧尾部推入 RPUSH queue task3 # 从左侧弹出移除并返回 LPOP queue # 返回 task2 # 从右侧弹出 RPOP queue # 返回 task3 # 获取列表长度 LLEN queue # 返回 1 # 获取指定范围元素0开始-1表示末尾 LRANGE queue 0 -1 # 返回所有元素4. 集合Set——无序不重复# 添加成员 SADD tags redis database cache # 获取所有成员 SMEMBERS tags # 返回三个标签顺序不定 # 检查成员是否存在 SISMEMBER tags redis # 返回 1 # 获取集合大小 SCARD tags # 返回 3 # 移除成员 SREM tags cache # 集合运算求交集 SINTER set1 set2 # 返回两个集合的交集5. 有序集合Sorted Set——带分数排序# 添加成员分数决定排序 ZADD leaderboard 100 player1 ZADD leaderboard 95 player2 ZADD leaderboard 110 player3 # 按分数升序获取排名 ZRANGE leaderboard 0 -1 # 返回 player2, player1, player3 # 按分数降序获取排名 ZREVRANGE leaderboard 0 -1 # 返回 player3, player1, player2 # 获取指定排名区间的成员带分数 ZREVRANGE leaderboard 0 2 WITHSCORES # 获取成员排名0开始 ZRANK leaderboard player1 # 返回 1 # 增加成员分数 ZINCRBY leaderboard 10 player1 # player1分数变为110键的生命周期管理# 设置过期时间秒 EXPIRE session_key 3600 # 查看剩余生存时间秒-1表示永不过期-2表示键不存在 TTL session_key # 移除过期时间使其永不过期 PERSIST session_key # 检查键是否存在 EXISTS mykey # 删除键 DEL mykey第五部分实战——如何选择与协同使用什么场景选什么选MySQL当主力数据结构稳定、明确如电商订单、用户账号、财务流水需要复杂的关联查询和多表JOIN必须保证强一致性金融、交易场景业务系统基于传统LAMP/LEMP栈选MongoDB加速开发数据模型不确定经常变化MVP快速迭代存储半结构化数据产品目录属性各异、用户画像配置天然适合JSON格式API层直接对接需要水平扩展处理海量数据选Redis做加速器缓存热点数据商品详情、查询结果降低主库压力存储用户会话Session、JWT Token实时统计计数器、排行榜轻量级消息队列List/Stream限流器Rate Limiting典型协同架构一个常见的三层数据架构应用层请求 ↓ Redis缓存层—— 命中则直接返回极速响应 ↓未命中 MongoDB文档库—— 存储灵活的非结构化数据 ↓需要强一致/复杂关联 MySQL关系库—— 存储核心事务数据实际案例电商商品详情页Redis缓存热门商品详情命中率80%响应1msMongoDB存储商品扩展属性不同品类属性差异大MySQL存储订单、库存、用户账户等核心交易数据把MySQL、MongoDB、Redis放在一起学不是为了比较谁更好而是为了理解在什么山唱什么歌MySQL是你的铁饭碗——可靠、成熟、哪里都能用MongoDB是你的瑞士军刀——灵活、快速、适应变化Redis是你的涡轮增压器——让系统体验飞起来掌握这三者你就拥有了构建绝大多数Web应用数据层的完整工具箱。接下来在具体项目中把理论知识落地才是真正的成长。