MySQL

·6 分钟阅读·2004 字
📋 目录

MySQL 日志与复制面试题


1. InnoDB 和 MyISAM 引擎的区别

【题目】

MySQL 中 InnoDB 和 MyISAM 引擎的区别是什么?

【参考答案】

特性InnoDBMyISAM
事务✅ 支持(ACID)❌ 不支持
锁粒度🔒 行锁(高并发)🔒 表锁(并发差)
外键✅ 支持❌ 不支持
索引聚簇索引非聚簇索引
行数统计实时扫描预存储,COUNT(*) 极快
崩溃恢复自动恢复(redo log)❌ 易损坏,需修复

生产选择

  • OLTP 业务InnoDB(事务、行锁、崩溃恢复)
  • 只读历史库/数据仓库 → 可用 MyISAM(COUNT 快、压缩率高)

【延伸追问】

  1. MyISAM 为什么不适合高并发写入?
  2. 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) 保证两者一致性

【延伸追问】

  1. redo log 和 binlog 的区别是什么?
  2. 两阶段提交在崩溃恢复中如何保证数据一致性?

【易错坑点】

  • 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)

【延伸追问】

  1. 主从延迟如何监控?(Seconds_Behind_Master 的局限性)
  2. 并行复制的原理是什么?

【易错坑点】

  • 异步复制有数据丢失风险,master 宕机时未同步的事务会丢失
  • ❌ Seconds_Behind_Master 并不总是准确反映延迟(slave 自身 I/O 瓶颈时该值可能为 0)
  • ❌ 大批量 DML 不拆分会导致复制延迟暴增

关联文档