一、事务的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的锁能把面试者分成青铜和王者(认真脸):

行锁vs表锁

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拿到手软!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐