文章目录
一、开局暴击三连问
“事务的ACID特性是什么?索引什么时候会失效?说说MySQL的锁机制!”——这三个问题要是答不上来(瑟瑟发抖),你可能连初面都过不了!作为混迹数据库领域多年的老司机,今天咱们就掰开揉碎聊聊MySQL必考的那些基础题。
二、硬核知识点逐个击破
1. 事务篇:你的数据库安全卫士
事务四大特性(ACID)可不是随便背背就完事:
- 原子性:要么全成功,要么全失败(比如转账时突然停电,钱不能凭空消失!)
- 一致性:数据必须符合所有约束(就像银行总账永远要平衡)
- 隔离性:多个事务并发时要互不干扰(划重点:这里藏着四个隔离级别!)
- 持久性:提交后的修改永久保存(突然断电也不怕)
(血泪教训)我曾经在可重复读隔离级别下踩过幻读的坑——明明查不到记录却插入失败,后来才明白要加间隙锁!
2. 索引篇:查询加速器的正确打开方式
B+树索引为什么是MySQL的默认选择?三层结构就能存2000万数据(震惊!)但下面这些操作会让索引失效:
WHERE age+1 > 20 -- 对字段进行运算
LIKE '%关键字%' -- 前导通配符
使用!=判断 -- 全表扫描警告!
(实战技巧)复合索引要遵守最左前缀原则,比如索引(a,b,c)时:
- WHERE a=1 AND b>2 ✅
- WHERE b=3 AND c=4 ❌
3. 锁的攻防战
表锁 vs 行锁就像大刀和绣花针的区别:
- MyISAM默认用表锁(简单粗暴)
- InnoDB用行锁+间隙锁(精细操作)
遇到死锁怎么办?别慌!MySQL会自动检测并回滚代价最小的事务。曾经有个电商系统每秒300订单,就靠设置合理的锁等参数扛住了压力。
4. 存储引擎的抉择
InnoDB和MyISAM这对老冤家怎么选?看这张对比表:
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ | ❌ |
| 外键 | ✅ | ❌ |
| 崩溃恢复 | 超强 | 容易丢数据 |
| 全文索引 | MySQL5.6+支持 | ✅ |
(重要结论)现在99%的场景都该选InnoDB!除非你要做全文检索且版本低于5.6。
三、面试官的隐藏题库
5. SQL优化三板斧
- EXPLAIN命令是必备神器(重点关注type和rows字段)
- 避免SELECT * 这种懒人写法
- 大数据量时用LIMIT分页要这样写:
SELECT * FROM table WHERE id > 100000 LIMIT 20
6. 三大范式之争
虽然理论上要遵守范式,但实际开发中:
- 第一范式(原子性)必须遵守
- 第二范式(消除部分依赖)建议遵守
- 第三范式(消除传递依赖)看情况——有时候适当冗余反而提升性能!
7. 视图和触发器的妙用
视图就像给SQL语句戴上面具:
CREATE VIEW vip_users AS
SELECT * FROM users WHERE level > 5
但注意!视图不是万能药,复杂视图会影响性能。
8. 备份恢复生死线
千万要掌握的两种备份方式:
- mysqldump(适合小数据量)
- xtrabackup(企业级热备工具)
(惨痛经历)有次误删生产库,全靠凌晨的备份+binlog恢复到故障前1分钟!
四、进阶加分项
9. 主从复制原理
记住这三个线程:
- Binlog Dump(主库)
- I/O Thread(从库)
- SQL Thread(从库)
主从延迟怎么监控?用SHOW SLAVE STATUS看Seconds_Behind_Master字段。
10. 缓存机制玄机
query_cache看起来美好实则鸡肋,8.0版本直接移除了!现在要靠:
- 合理的索引设计
- 应用层缓存(Redis真香)
- 连接池配置优化
五、避坑指南(含泪总结)
- 编码问题要统一用utf8mb4(支持emoji!)
- 时间字段别用字符串存(TIMESTAMP真香)
- 自增ID达到上限会怎样?——报错!所以用BIGINT准没错
- 线上禁用触发器!曾经有个触发器递归调用把CPU跑满…
六、写在最后
MySQL就像个宝藏库,你以为已经摸透了,每次面试却总有新发现(哭)。建议新手从《高性能MySQL》开始啃,再配合线上实验——光说不练假把式!
(互动时间)你面试时被问过什么奇葩的MySQL问题?欢迎留言讨论!对了,记得点个赞再走啊~
2265

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



