MySQL面试必问的10个基础问题(附详细解析)
本文总结了MySQL面试核心知识点:1.事务ACID特性(原子性、一致性、隔离性、持久性),重点讲解转账示例和隔离级别;2.索引优化技巧,包括B+树结构、最左前缀原则和索引失效场景;3.锁机制区分(行锁/表锁、共享/排他锁、间隙锁);4.SQL优化三板斧(EXPLAIN分析、重写SQL、分页优化)。此外还简要介绍了存储引擎对比、范式、视图、备份恢复、主从复制和分库分表方案。建议通过实践加深理解。
一、事务的ACID特性(必考题!!!)
老铁们!事务这玩意儿绝对是面试官的最爱(敲黑板)。ACID四个字母必须掰开了揉碎了讲清楚:
Atomicity(原子性):事务要么全成功,要么全失败。举个转账栗子 :A转100给B,系统必须同时完成A账户-100和B账户+100的操作,不能只执行一半!
Consistency(一致性):事务前后数据库必须处于合法状态。比如转账后总金额不能变,违反约束就回滚(这个最容易和业务逻辑混淆)
Isolation(隔离性):多个并发事务之间要隔离。重点掌握四种隔离级别(读未提交→读提交→可重复读→串行化)
Durability(持久性):事务提交后数据永久保存。即使系统崩溃,重启后数据还在(主要靠redo log保证)
Atomicity(原子性):事务要么全成功,要么全失败。举个转账栗子 :A转100给B,系统必须同时完成A账户-100和B账户+100的操作,不能只执行一半!
Consistency(一致性):事务前后数据库必须处于合法状态。比如转账后总金额不能变,违反约束就回滚(这个最容易和业务逻辑混淆)
Isolation(隔离性):多个并发事务之间要隔离。重点掌握四种隔离级别(读未提交→读提交→可重复读→串行化)
Durability(持久性):事务提交后数据永久保存。即使系统崩溃,重启后数据还在(主要靠redo log保证)
sql
-- 经典转账示例
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';
COMMIT;
面试加分项:可以提到MySQL默认使用可重复读(Repeatable Read)隔离级别,但实际是通过MVCC多版本并发控制实现的,并不是真正的可重复读!
二、索引优化(高频考点)
索引就像字典的目录(这个比喻百试不爽),但用不好反而会拖慢速度:
B+树结构:比起B树,所有数据都存在叶子节点,查询更稳定(三层B+树可存2000万数据)
最左前缀原则:联合索引(a,b,c),生效场景:
WHERE a=1 AND b=2 ✅
WHERE b=2 AND c=3 ❌
WHERE a>1 AND b=2 ✅(但范围查询后索引可能失效)
索引失效场景(超级重要):
对字段做函数操作:WHERE YEAR(create_time)=2023
隐式类型转换:user_id是varchar类型,但写成WHERE user_id=123
模糊查询以%开头:LIKE '%abc'
B+树结构:比起B树,所有数据都存在叶子节点,查询更稳定(三层B+树可存2000万数据)
最左前缀原则:联合索引(a,b,c),生效场景:
WHERE a>1 AND b=2 ✅(但范围查询后索引可能失效)
索引失效场景(超级重要):
血泪教训:见过某系统建了20个索引,结果写操作比读还慢!建议单表索引不超过5个,联合索引字段不超过3个。
三、锁机制(区分度最高的题)
MySQL的锁能把面试者分成青铜和王者(认真脸):
InnoDB默认行锁(需要索引支持)
MyISAM只支持表锁
锁升级:当超过5000行锁时会自动升表锁
共享锁(S)与排他锁(X):
sql
SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE; -- 共享锁
SELECT * FROM table WHERE id=1 FOR UPDATE; -- 排他锁
间隙锁(Gap Lock):防止幻读,锁定索引记录之间的间隙。比如已有id=1和5,查询WHERE id>1 AND id<5时会锁住(1,5)区间
锁升级:当超过5000行锁时会自动升表锁
共享锁(S)与排他锁(X):
sql
SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE; -- 共享锁
SELECT * FROM table WHERE id=1 FOR UPDATE; -- 排他锁
间隙锁(Gap Lock):防止幻读,锁定索引记录之间的间隙。比如已有id=1和5,查询WHERE id>1 AND id<5时会锁住(1,5)区间
实战建议:高并发场景优先考虑读提交隔离级别+乐观锁(version字段),比可重复读的锁开销小很多!
四、SQL优化思路(最能体现实力)
遇到慢查询不要慌,三板斧走起:
EXPLAIN分析法(核心中的核心):
type列:system > const > ref > range > index > ALL
Extra列:出现Using filesort或Using temporary要警惕
重写SQL技巧:
用JOIN代替子查询
LIMIT分页优化:不要直接用LIMIT 100000,20,改用WHERE id>xxx
避免SELECT *,只取需要字段
拆解大事务:超过3秒的事务建议拆分成小事务,避免长时间锁竞争
Extra列:出现Using filesort或Using temporary要警惕
重写SQL技巧:
避免SELECT *,只取需要字段
拆解大事务:超过3秒的事务建议拆分成小事务,避免长时间锁竞争
(因篇幅限制,以下为简略版要点)
五、存储引擎对比
InnoDB:支持事务、行锁、外键,适合OLTP
MyISAM:表锁、全文索引,适合读多写少
Memory:数据存内存,重启丢失
六、三大范式
1NF:字段原子性
2NF:消除部分依赖
3NF:消除传递依赖
(反范式设计在实际业务中很常见)
七、视图优缺点
优点:简化查询、权限控制
缺点:无法建立索引、修改受限
八、备份与恢复
mysqldump:逻辑备份,适合小数据量
xtrabackup:物理备份,适合大数据
binlog:增量恢复神器
九、主从复制原理
Master写binlog
Slave IO线程拉取日志
Slave SQL线程重放
(异步复制可能导致数据延迟)
十、分库分表方案
水平拆分:按range/hash分
垂直拆分:按业务模块分
中间件:ShardingSphere、MyCat
最后给个忠告:死记硬背不如动手实践!建议自己用Docker搭建MySQL环境,把每个知识点都实操验证一遍(真的会印象深刻)。祝各位面试顺利,offer拿到手软!
更多推荐
所有评论(0)