文章目录
前言:为什么你总在MySQL面试栽跟头?
“这个场景应该加什么索引?事务隔离级别怎么选?”——是不是每次听到这种问题就手心冒汗?别慌!今天咱们不整那些花里胡哨的理论,直接上硬菜!我把自己面试别人和被面试的血泪经验都浓缩在这10个问题上,看完保你面试官直呼内行!(文末有惊喜彩蛋)
一、事务四大特性(必考题!!)
你以为ACID就是原子性、一致性、隔离性、持久性?Too young!面试官要的是这样的回答:
-
原子性(Atomicity)
就像银行转账:要么全成功,要么全失败。举个反例:A给B转100,A扣款成功但B没到账?MySQL说:这锅我不背! -
一致性(Consistency)
这是数据库的"强迫症"!比如账户总额必须不变,转出100就必须有账户+100(别以为这很简单,分布式系统里这可是大坑) -
隔离性(Isolation)
重点来了!这直接关系到并发问题。举个栗子:你和你女朋友同时查银行卡余额,看到的金额不同步怎么办?(这就是传说中的脏读/不可重复读) -
持久性(Durability)
数据一旦提交,就算数据库炸了也得给我存住!这里有个冷知识:InnoDB用redo log保证持久性,而MyISAM…(你品,你细品)
二、InnoDB和MyISAM的世纪大战
面试官最爱挖的坑:“说说它们的区别?” 标准答案已经过时了!2023年最新对比姿势:
| InnoDB | MyISAM(已过气) | |
|---|---|---|
| 事务支持 | √(金融系统必备) | ×(凉凉) |
| 锁粒度 | 行级锁(高并发神器) | 表锁(性能杀手) |
| 外键 | √ | × |
| 崩溃恢复 | 自动恢复(DBA的救星) | 手动检查(头秃警告) |
| 存储文件 | .ibd + .frm | .MYD + .MYI + .frm |
血泪教训:我见过有人线上库用MyISAM,结果服务器重启后数据全乱…(现在你知道该选谁了吧?)
三、索引优化の奥义
“给姓名和年龄建联合索引,查询条件带年龄会走索引吗?”——这是高频送命题!
索引失效的六大作死行为:
- 最左前缀原则破坏者(比如跳过了name直接查age)
- 在索引列上搞计算(where age+1>20)
- 类型转换暗杀(varchar字段传了数字)
- or条件滥用(or两边都有索引才行)
- 模糊查询开火车(like ‘%张%’)
- 全表扫描更快的错觉(数据量小时可能直接扫表)
实战技巧:
EXPLAIN SELECT * FROM users WHERE name LIKE '张%' AND age > 20;
看type列是不是range,rows是不是小于表总行数的30%(这才是有效索引的证明)
四、事务隔离级别の修罗场
记住这个面试金句:“隔离级别越低,并发性能越高,但问题越多!”
| 级别 | 脏读 | 不可重复读 | 幻读 | 适用场景 |
|---|---|---|---|---|
| 读未提交(自杀级) | √ | √ | √ | 统计类业务(不推荐!) |
| 读已提交(ORACLE默认) | × | √ | √ | 金融交易流水 |
| 可重复读(MySQL默认) | × | × | √ | 账单系统 |
| 串行化(同归于尽级) | × | × | × | 敏感资金操作 |
避坑指南:MVCC机制下,可重复读级别其实通过间隙锁解决了大部分幻读问题(这个知识点能惊艳面试官!)
五、死锁の三十六计
线上遇到过死锁吗?教你三招破敌:
-
锁检测:
SHOW ENGINE INNODB STATUS查看最新死锁日志 -
重试机制:
捕获1213错误码(死锁错误),自动重试3次 -
釜底抽薪:
- 统一加锁顺序(比如按id排序)
- 缩小事务范围
- 合理设置超时时间
innodb_lock_wait_timeout
六、EXPLAIN执行计划の天书解读
看懂这个比算命还准!重点看这5列:
-
type:
system > const > eq_ref > ref > range > index > ALL
(看到ALL就要准备跑路了) -
rows:
估算要查的行数,超过1万就要警惕 -
Extra:
- Using filesort:赶紧优化排序字段索引
- Using temporary:临时表警告!
- Using index:恭喜,索引覆盖
七、分页查询の性能陷阱
LIMIT 100000,10 慢到哭?试试这三板斧:
-
延迟关联:
SELECT * FROM table INNER JOIN (SELECT id FROM table LIMIT 100000,10) AS tmp USING(id) -
游标分页:
WHERE id > 100000 ORDER BY id LIMIT 10 -
业务妥协:
- 禁止跳页查询(像某宝那样)
- 使用Elasticsearch辅助查询
八、三大日志の爱恨情仇
日志系统是MySQL的"黑匣子":
-
binlog(主从复制核心):
逻辑日志,支持statement/row/mixed格式 -
redo log(崩溃恢复神器):
物理日志,两阶段提交保障ACID -
undo log(MVCC基石):
保证事务回滚和多版本控制
冷知识:写redolog是顺序IO,比写数据文件快100倍!
九、SQL优化の七伤拳
这些优化技巧用不好会反噬:
-
**避免SELECT ***:
特别是TEXT/BLOB字段,传输数据量过大 -
谨慎使用JOIN:
超过3表JOIN建议拆分成多次查询 -
COUNT(*)优化:
MyISAM直接返回元数据,InnoDB建议用额外计数表 -
字符集陷阱:
UTF8mb4已是主流,排序规则选utf8mb4_0900_ai_ci
十、终极拷问:你遇到过哪些MySQL坑?
这个问题答好了直接涨薪20%!参考话术:
“有一次我们线上突然出现大量慢查询,最后发现是研发同学在循环里执行SELECT…(停顿)后来通过改成批量查询+Redis缓存,QPS从100飙升到5000!”
或者:
“做过一次亿级数据迁移,用pt-online-schema-change工具在线改表结构,结果因为没设置好chunk_size导致从库延迟…(此处展示复盘能力)”
避坑指南:新人最容易踩的5个雷
-
自增ID用完了怎么办?
(答案:bigint够你用100年) -
UTF8不是真正的UTF8!
(要用utf8mb4支持emoji) -
NULL和空字符串不一样!
(索引处理方式完全不同) -
不要在代码里拼SQL!
(SQL注入警告!) -
过度分库分表是万恶之源!
(单表500万数据根本不用分)
结语:MySQL学习の三重境界
第一层:会写SQL语句
第二层:懂索引和事务原理
第三层:理解架构设计与业务场景的平衡
记住:MySQL就像你的老朋友——你越懂它,它就越靠谱!最后送大家一句话:纸上得来终觉浅,绝知此事要躬行!(赶紧打开电脑实操吧)
彩蛋:面试被问到不会的问题怎么办?标准话术:“这个问题我之前没有深入接触过,但我的理解是…(快速逻辑推导)”,既能展示思维过程,又体现学习能力!
593

被折叠的 条评论
为什么被折叠?



