1. 数据库面试核心要点解析
作为技术面试的必考领域,数据库相关知识点占据了后端开发岗位考察的30%以上的比重。最近在准备腾讯技术面时,我系统梳理了数据库领域的核心八股内容,这些知识点不仅高频出现在大厂面试中,更是实际工作中必须掌握的硬核技能。
2. 数据库基础理论
2.1 事务特性与隔离级别
ACID特性是数据库事务的基石:
- 原子性(Atomicity):事务是不可分割的工作单位
- 一致性(Consistency):事务执行前后数据库都处于一致状态
- 隔离性(Isolation):并发事务间互不干扰
- 持久性(Durability):事务提交后改变永久有效
常见隔离级别及问题:
- 读未提交(Read Uncommitted):脏读、不可重复读、幻读
- 读已提交(Read Committed):不可重复读、幻读
- 可重复读(Repeatable Read):幻读(MySQL默认级别)
- 串行化(Serializable):无并发问题但性能最低
实际开发中,MySQL默认使用RR级别但通过MVCC+间隙锁避免了幻读问题
2.2 索引原理与优化
B+树索引特点:
- 非叶子节点只存key不存data
- 叶子节点包含全部数据并按key排序
- 叶子节点间通过指针连接形成链表
索引优化实践:
- 遵循最左前缀原则设计联合索引
- 避免在索引列上使用函数或运算
- 区分度低的字段不适合建索引
- 控制单表索引数量(建议不超过5个)
3. MySQL核心机制
3.1 存储引擎对比
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | 支持 | 不支持 |
| 锁粒度 | 行锁 | 表锁 |
| 外键 | 支持 | 不支持 |
| 崩溃恢复 | 支持 | 不支持 |
| 全文索引 | 5.6+支持 | 支持 |
| 适用场景 | OLTP | OLAP/读多写少 |
3.2 日志系统详解
- redo log(重做日志)
- InnoDB特有,物理日志
- 实现事务的持久性
- 循环写入,固定大小
- 崩溃恢复时重放未刷盘操作
- undo log(回滚日志)
- 逻辑日志,记录数据修改前的状态
- 实现事务回滚和MVCC
- 不会主动删除,通过purge线程清理
- binlog(归档日志)
- Server层实现,逻辑日志
- 主从复制和数据恢复使用
- 三种格式:STATEMENT/ROW/MIXED
4. 性能优化实战
4.1 慢查询分析流程
- 开启慢查询日志
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1;- 使用explain分析执行计划 重点关注:
- type:ALL(全表扫描)需优化
- key:实际使用的索引
- rows:预估扫描行数
- Extra:Using filesort/Using temporary需警惕
- 优化方案制定
- 添加合适索引
- 重写复杂SQL
- 调整表结构
- 使用缓存
4.2 分库分表策略
水平拆分原则:
- 按范围:如按时间、ID区间
- 按哈希:均匀分布数据
- 按业务:不同业务分到不同库
常见问题及解决方案:
- 分布式ID生成:雪花算法
- 跨库查询:全局表/字段冗余
- 分布式事务:XA/TCC/SAGA
- 数据迁移:双写+增量同步
5. 高可用架构
5.1 主从复制原理
- 主库binlog dump线程发送日志
- 从库I/O线程接收日志写入relay log
- 从库SQL线程重放relay log
复制模式对比:
- 异步复制:性能最好但可能丢数据
- 半同步复制:至少一个从库确认
- 全同步复制:所有从库确认
5.2 读写分离实现
常见方案:
- 中间件:MyCat/ShardingSphere
- 驱动层:MySQL Router
- 代码层:Spring AOP
注意事项:
- 主从延迟问题
- 事务路由策略
- 故障自动切换
6. 面试高频问题
一条SQL的执行过程
- 连接器建立连接
- 分析器语法分析
- 优化器生成执行计划
- 执行器调用存储引擎接口
- 返回结果
InnoDB如何解决幻读
- MVCC多版本并发控制
- 间隙锁(Gap Lock)
- Next-Key Lock(记录锁+间隙锁)
为什么用B+树不用B树
- 更矮胖的树结构减少IO
- 范围查询效率更高
- 非叶子节点不存data使单页能存更多key
7. 实战经验分享
大表加字段的正确姿势
- 先在从库执行
- 使用pt-online-schema-change
- 避免业务高峰期操作
- 监控主从延迟
连接池参数调优
- max_connections:根据QPS和平均执行时间计算
- wait_timeout:避免连接泄漏
- thread_cache_size:减少线程创建开销
备份恢复策略
- 全量备份+binlog增量
- 定期恢复演练
- 多机房异地备份
- 备份文件加密存储
8. 进阶学习路线
源码阅读建议
- 从SQL解析开始
- 重点研究优化器和执行器
- 理解存储引擎接口
性能压测工具
- sysbench:综合基准测试
- tpcc-mysql:事务处理测试
- mysqlslap:查询性能测试
推荐学习资料
- 《MySQL技术内幕:InnoDB存储引擎》
- 《高性能MySQL》
- MySQL官方文档
- 阿里云数据库博客