跳到主要内容

数据库原理

"数据库是任何应用的心脏。"

理解数据库原理有助于编写高效查询、选择合适的数据模型,并在负载下优化性能。

概览

本节涵盖后端工程师最关键的两类数据库:

MySQL

Redis

高级主题

快速参考

MySQL 索引

类型说明使用场景
B+ Tree平衡树,支持范围查询主键、大多数列
主键索引聚簇索引,数据与索引一起存储主键
二级索引非聚簇,存储主键值频繁查询的列
组合索引多列索引多条件 WHERE

事务隔离级别

级别脏读不可重复读幻读性能
Read Uncommitted最快
Read Committed (RC)
Repeatable Read (RR)⚠️*中等
Serializable最慢

*MySQL InnoDB 通过 Gap Lock 防止幻读

Redis 数据结构

结构使用场景命令
String简单缓存、计数器GETSETINCR
Hash对象存储HGETHSETHGETALL
List消息队列、动态流LPUSHRPOPLRANGE
Set唯一元素、标签SADDSMEMBERSSINTER
Sorted Set排行榜、排名ZADDZRANGEZRANK

常见陷阱

MySQL

  • WHERE 列缺少索引 → 全表扫描
  • ❌ 对列使用函数(WHERE YEAR(date) = 2024)→ 索引失效
  • ❌ 深分页(LIMIT 1000000, 10)→ 扫描数百万行
  • ✅ 使用 EXPLAIN 分析查询
  • ✅ 根据查询模式添加索引
  • ✅ 监控慢查询日志

Redis

  • ❌ 未设置 TTL → 内存泄漏
  • ❌ 缓存击穿 → 数据库过载
  • ❌ 缓存穿透 → 反复查询不存在的数据
  • ✅ 始终为缓存数据设置 TTL
  • ✅ 使用合适的数据结构(对象用 Hash)
  • ✅ 监控内存使用和命中率

学习路径

面试准备

  1. MySQL 架构 → 索引 → 事务 → 锁
  2. Redis 数据结构 → 缓存模式 → 持久化

生产实践

  1. MySQL 优化 → 索引 → 事务 → 复制
  2. Redis 缓存模式 → 持久化 → 集群
生产建议
  1. 始终使用连接池(Java 用 HikariCP)
  2. 根据查询模式添加索引,而非猜测
  3. 定期监控慢查询日志
  4. 为 Redis 缓存条目设置合适的 TTL
  5. 读密集型工作负载使用读副本