第4章 数据库与存储技术深度:SQL基础、Redis、MySQL优化、存储方案选型
数据库与存储是大厂实习生面试的必考板块,面试官重点关注你对 SQL 执行效率、缓存策略和存储选型的理解。本章拆解 3 个高频面试问答 + 1 个真实项目案例,帮你建立从「会用」到「会优化」的回答体系。
| 技术领域 | 核心知识点 | 面试频率 | 实习要求 |
|---|---|---|---|
| SQL 基础 | JOIN、索引、事务隔离级别、聚合函数 | ★★★★★ | 必考 |
| Redis | 5 种数据结构、缓存策略、持久化、分布式锁 | ★★★★☆ | 高频 |
| MySQL 优化 | 慢查询、EXPLAIN、索引优化、SQL 重写 | ★★★★★ | 必考 |
| 存储方案选型 | 关系型 vs 非关系型、读写分离、分库分表 | ★★★☆☆ | 了解 |
💡 复习策略: SQL 基础 + MySQL 优化是「保底分」,Redis 是「加分项」。面试时能说出量化效果(如“优化后响应从 200ms → 20ms”)会大幅提升印象。
🧩 面试问题:请解释 INNER JOIN 和 LEFT JOIN 的区别?什么场景下使用?
🎯 面试官考察点:
- 是否理解 JOIN 的集合语义(交集 vs 保留主表)
- 能否根据业务需求正确选择 JOIN 类型
- 对多表 JOIN 执行顺序是否有认知
📐 回答框架:
- 定义区别:INNER JOIN 只返回两表匹配的行(交集);LEFT JOIN 返回左表全部行,右表无匹配填 NULL
- 场景映射:“查已下单用户”用 INNER JOIN;“查所有用户及其订单”用 LEFT JOIN
- 执行提示:多表 JOIN 时 MySQL 会优化顺序,但建议小表驱动大表
✏️ 简短示例回答:
INNER JOIN 返回两表交集行,只保留匹配成功的数据;LEFT JOIN 返回左表全部行,右表无匹配时填充 NULL。查询「已下单用户」用 INNER JOIN,「所有用户及订单」用 LEFT JOIN。注意大表 JOIN 时要确保关联字段有索引。
🔍 可能追问:
- JOIN 底层是怎么执行的?Nested Loop Join 和 Hash Join 的区别?
- LEFT JOIN 时右表条件写在 WHERE 和写在 ON 有什么区别?
⚠️ 避坑提醒:
- 不要混淆 LEFT JOIN 和 RIGHT JOIN 的语义,面试用 LEFT JOIN 更自然
- 避免大表 JOIN 无索引导致全表扫描——一定要检查 Extra 字段
🧩 面试问题:Redis 有哪些数据结构?分别适用于什么场景?
🎯 面试官考察点:
- 是否熟练掌握 5 种核心数据结构及特性
- 能否根据业务场景做合理选型
- 是否了解扩展结构(Bitmap、HyperLogLog)
📐 回答框架:
- 列举 5 种核心结构:String、Hash、List、Set、ZSet
- 逐个说明特点 + 场景:String→缓存/计数器;Hash→对象存储;List→队列;Set→去重;ZSet→排行榜
- 补充扩展:Bitmap 做签到,HyperLogLog 做 UV 统计
✏️ 简短示例回答:
String 用于缓存和计数器;Hash 存用户信息;List 做消息队列;Set 实现去重和共同好友;ZSet 用于排行榜。选型看数据结构:纯键值用 String,对象用 Hash,有序集合用 ZSet。此外 Bitmap 适合签到场景,HyperLogLog 适合 UV 统计。
🔍 可能追问:
- Redis 的过期策略有哪些?内存淘汰机制怎么选?
- 如何用 Redis 实现分布式锁?有哪些要注意的坑?
⚠️ 避坑提醒:
- 不要用 List 做随机访问(复杂度 O(n)),应用场景是队列
- ZSet 底层是跳表 + 哈希表,面试要能说出跳表的基本思想