文章目录
1. 事务的ACID特性怎么理解?(必考题)
先给标准答案:
- 原子性(Atomicity):事务里的操作要么全成功,要么全失败
- 一致性(Consistency):数据在事务前后保持合法状态
- 隔离性(Isolation):多个并发事务互不干扰
- 持久性(Durability):事务提交后修改永久保存
但面试官最想听的是你的理解!!!举个转账例子:
A给B转账500元,这个事务包含两个操作:
- A账户-500
- B账户+500
如果只执行了第一步就宕机,这时候原子性就保证了两个操作要么都执行,要么都不执行(数据库会通过undo log回滚)。一致性则确保转账后总金额不变,不会出现A-500但B没+500的情况。
2. 索引底层原理(B+树必须掌握)
很多同学只知道索引能加快查询,但说不清原理(这就很危险了)。MySQL默认使用B+树索引,它有这些特点:
- 非叶子节点只存键值,叶子节点存储完整数据(InnoDB)
- 叶子节点用双向链表连接,适合范围查询
- 树的高度通常3-4层,千万级数据也只要3次IO
(画重点)为什么不用二叉树?
因为二叉树可能退化成链表,而B+树每个节点可以有多个子节点,有效控制树高。实测对比:100万数据B+树高度3层,二叉树可能高达20层!
3. 事务隔离级别与问题
这个知识点很多人背了又忘,我教你用场景记忆法:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | ✔️ | ✔️ | ✔️ |
读已提交 | ✖️ | ✔️ | ✔️ |
可重复读 | ✖️ | ✖️ | ✔️ |
串行化 | ✖️ | ✖️ | ✖️ |
举个幻读例子:事务A查询age>18的记录得到2条,这时事务B插入1条age=20的记录并提交。事务A再次查询得到3条,就像出现幻觉一样!
4. 聚簇索引 vs 非聚簇索引
(超级重要区别)
聚簇索引:
- 叶子节点存整行数据
- 每个表只能有一个
- 主键索引就是聚簇索引
非聚簇索引:
- 叶子节点存主键值
- 需要回表查询
- 可以创建多个
举个查询场景:
SELECT * FROM users WHERE name = '张三';
如果name字段有非聚簇索引,查询过程是:
- 在name索引树找到’张三’对应的主键id
- 用主键id去聚簇索引树取整行数据
5. 行锁、表锁、间隙锁
锁机制是保证并发安全的关键:
- 行锁:锁定某一行,InnoDB默认锁粒度
- 表锁:MyISAM默认,锁整个表
- 间隙锁:锁定索引记录之间的间隙(解决幻读)
特别注意:
UPDATE语句如果没有走索引会升级为表锁!!!
比如执行:
UPDATE users SET age=20 WHERE name='李四';
如果name字段没索引,就会锁整个表,千万要注意!
6. 三大日志:undo log、redo log、binlog
(日志体系是MySQL的精华)
- undo log:用于事务回滚,记录数据修改前的值
- redo log:保证持久性,记录物理修改
- binlog:主从复制使用,记录逻辑操作
更新语句执行流程:
- 从磁盘加载数据到内存
- 写undo log
- 修改内存中的数据
- 写redo log(prepare状态)
- 写binlog
- 提交事务,redo log改为commit状态
7. JOIN的七种用法
实际开发最常用的三种:
- INNER JOIN:取交集
- LEFT JOIN:左表全保留
- RIGHT JOIN:右表全保留
(易错点)ON和WHERE的区别:
- ON是连接条件,在JOIN时过滤
- WHERE是在连接后过滤
示例:
SELECT *
FROM A LEFT JOIN B
ON A.id = B.a_id
WHERE B.status = 1; -- 这会过滤掉B表为null的记录
8. SQL优化实战技巧
分享几个立竿见影的优化技巧:
- 避免SELECT *,只取需要的字段
- 用EXISTS代替IN(当子查询结果集大时)
- 分页查询优化:
常规写法:
优化方案:SELECT * FROM table LIMIT 1000000,10; -- 慢
SELECT * FROM table WHERE id > 1000000 LIMIT 10;
9. 主从复制原理
(面试高频考点)
主从复制三步走:
- Master将数据变更写入binlog
- Slave的IO线程读取Master的binlog
- Slave的SQL线程重放binlog
配置主从的坑点总结:
- server-id必须唯一
- 从库需要设置read_only
- 注意binlog格式(推荐row格式)
- 主从时间要同步
10. Explain执行计划详解
学会看Explain输出是调优的基本功,核心字段:
- type:访问类型(最好到ref,避免ALL)
- key:实际使用的索引
- rows:预估扫描行数
- Extra:额外信息(Using filesort要警惕)
示例分析:
EXPLAIN SELECT * FROM users WHERE age > 18 ORDER BY name;
如果Extra出现"Using filesort",说明需要优化排序,可以创建(age,name)的复合索引。
🚀最后的小建议
MySQL的知识点看似零散,但其实都是围绕两个核心展开:
- 如何保证数据安全(ACID、锁、日志)
- 如何提高查询性能(索引、执行计划、架构设计)
建议准备面试时,每个知识点都自己动手实践一遍。比如配置主从复制,虽然现在云数据库很方便,但自己搭建一次能理解很多原理性问题。遇到问题时善用官方文档(MySQL :: MySQL 8.0 Reference Manual),比搜索引擎更可靠!