面试复习:MySQL 索引、事务 MVCC、日志与调优(初中高级三层)
一篇按初级/中级/高级三层拆开的 MySQL 面试复习:B+ 树与联合索引、MVCC 与间隙锁、redo/undo/binlog 两阶段提交、explain 调优、深分页、主从延迟、分库分表和大表在线加字段,含追问链与速查表。
从一个关键词,发现新的思路。
一篇按初级/中级/高级三层拆开的 MySQL 面试复习:B+ 树与联合索引、MVCC 与间隙锁、redo/undo/binlog 两阶段提交、explain 调优、深分页、主从延迟、分库分表和大表在线加字段,含追问链与速查表。
月初征期一到,一批热点 key 在同一秒过期,请求全部回源,MySQL 连接数瞬间打满。从命中率与 QPS 曲线定位击穿,辨析穿透/击穿/雪崩,并给出互斥锁、逻辑过期、随机 TTL、布隆过滤器与多级缓存的落地写法。
一条上线半年都很快的 SQL 突然变慢,EXPLAIN 显示 type=ALL。从慢日志、pt-query-digest 到 EXPLAIN 逐列解读,逐个排查隐式类型转换、函数包裹列、前导 % 与字符集不一致导致索引失效,并给出改法。
业务偶发报 MySQL 1213 死锁,几百单里才一两单。用 SHOW ENGINE INNODB STATUS 逐行读懂 LATEST DETECTED DEADLOCK,配合 innodb_print_all_deadlocks 复现两类典型死锁:相反顺序加锁与间隙锁,并给出重试和统一加锁顺序的治法。
线上执行 ALTER TABLE 加字段,结果这张表所有读写全部排队。原因是一个没提交的长事务持有 MDL 读锁,ALTER 等写锁,后续请求全被堵在队列。附 processlist、performance_schema、sys 视图定位与 kill、Online DDL、gh-ost、lock_wait_timeout 的做法。
读写分离上线后,用户“下单成功却看不到订单”。用 SHOW REPLICA STATUS 看 Seconds_Behind_Source,定位到大事务与单线程回放,再讲并行复制、Canal 延迟排查,以及“读自己写的”几种落地方案。
接口大面积报 Connection is not available, request timed out after 30000ms。用 Hikari 日志、show processlist 与 jstack 交叉验证,找出事务里调远程接口占着连接的元凶,并讲清 maximumPoolSize 的公式、leakDetectionThreshold 与指标告警。
MyBatis 与 MyBatis-Plus 的实用笔记:#{} 与 ${} 的区别和注入风险、一级二级缓存的坑、批量插入的三种写法对比、分页插件原理、动态 SQL 与常见错误,以及生产慢 SQL 从发现到优化的完整流程。
一份偏实战的 MySQL 笔记:B+ 树索引结构与最左前缀、索引失效的八种写法、MVCC 与四种隔离级别、行锁/间隙锁/死锁的排查命令,以及慢 SQL 从 EXPLAIN 到优化的完整套路,含一次征期高峰死锁的复盘。