MySQL 日志与复制面试题
1. InnoDB 和 MyISAM 引擎的区别
【题目】
MySQL 中 InnoDB 和 MyISAM 引擎的区别是什么?
【参考答案】
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务 | ✅ 支持(ACID) | ❌ 不支持 |
| 锁粒度 | 🔒 行锁(高并发) | 🔒 表锁(并发差) |
| 外键 | ✅ 支持 | ❌ 不支持 |
| 索引 | 聚簇索引 | 非聚簇索引 |
| 行数统计 | 实时扫描 | ✅ 预存储,COUNT(*) 极快 |
| 崩溃恢复 | ✅ 自动恢复(redo log) | ❌ 易损坏,需修复 |
生产选择
- OLTP 业务 → InnoDB(事务、行锁、崩溃恢复)
- 只读历史库/数据仓库 → 可用 MyISAM(COUNT 快、压缩率高)
【延伸追问】
- MyISAM 为什么不适合高并发写入?
- InnoDB 如何通过 MVCC 提高并发性能?
【易错坑点】
- ❌ InnoDB 的 COUNT(*) 比 MyISAM 慢是正常现象,不要试图优化
- ❌ 不要在生产环境混用两种引擎,事务和非事务操作混用会导致难以排查的问题
2. MySQL 日志文件
【题目】
MySQL 日志文件有哪些?分别介绍下作用?
【参考答案】
Server 层日志:
| 日志 | 作用 | 说明 |
|---|---|---|
| 错误日志(error log) | 记录启动/运行/关闭的错误 | 🔍 定位故障第一步 |
| 慢查询日志(slow query log) | 记录超过 long_query_time 的查询 | 📊 SQL 优化依据 |
| 一般查询日志(general log) | 记录所有请求 | ⚠️ 生产慎开,严重影响性能 |
| 二进制日志(binlog) | 记录所有 DDL/DML | 🔄 主从复制 + 🕐 PITR 恢复 |
InnoDB 引擎层日志:
| 日志 | 作用 |
|---|---|
| 重做日志(redo log) | 保证持久性,崩溃恢复时重放已提交事务 |
| 回滚日志(undo log) | 保证原子性,回滚未提交事务,实现 MVCC |
Redo Log vs Binlog 两者不是同一回事:
- redo log:物理日志(记录页修改),InnoDB 引擎层,循环写
- binlog:逻辑日志(记录 SQL/行变更),Server 层,追加写
- 两阶段提交(2PC) 保证两者一致性
【延伸追问】
- redo log 和 binlog 的区别是什么?
- 两阶段提交在崩溃恢复中如何保证数据一致性?
【易错坑点】
- ❌ binlog 不是 redo log,前者是 Server 层,后者是 InnoDB 引擎层
- ❌ 慢查询日志默认阈值 10 秒,生产建议调整为 1~2 秒
- ❌ 忽略 innodb_flush_log_at_trx_commit 对持久性的影响
3. 主从复制原理
【题目】
MySQL 主从复制原理了解吗?
【参考答案】
三步流程:
① Master 更新 → binlog ② Dump Thread → 推送 binlog → Slave IO Thread → relay log ③ SQL Thread → 读取 relay log → 重放执行
复制模式对比:
| 模式 | 数据安全性 | 性能影响 | 推荐场景 |
|---|---|---|---|
| 异步复制(默认) | ❌ 有数据丢失风险 | ⭐⭐⭐ 最高 | 对一致性要求不高的场景 |
| 半同步复制 | ✅ 至少一个 slave 确认 | ⭐⭐ 中等 | 生产环境推荐 |
| GTID 复制 | ✅ 全局事务 ID | ⭐⭐⭐ 方便切换 | MySQL 5.6+ 推荐 |
主从延迟常见原因:
- 🐢 slave 单线程 SQL 重放(可开启并行复制缓解)
- 📦 master 写入压力过大
- 🌐 网络延迟
- 📌 大事务(DDL、大批量 DELETE)
【延伸追问】
- 主从延迟如何监控?(Seconds_Behind_Master 的局限性)
- 并行复制的原理是什么?
【易错坑点】
- ❌ 异步复制有数据丢失风险,master 宕机时未同步的事务会丢失
- ❌ Seconds_Behind_Master 并不总是准确反映延迟(slave 自身 I/O 瓶颈时该值可能为 0)
- ❌ 大批量 DML 不拆分会导致复制延迟暴增
关联文档
- MySQL 复制原理与配置 — 主从复制配置详解
- MySQL binlog 保留时间与清理 — Binlog 管理
- MySQL 基础知识面试题 — 基础概念题