MySQL 面试常见的 12 个底层问题¶
下面整理一份 MySQL 面试最难的 12 个底层问题(大厂常问)。 这些问题在后端 / 数据库岗位面试中非常常见,尤其涉及 MySQL 的 InnoDB 引擎底层原理。🚀
一、索引原理(4题)¶
1. 为什么数据库索引使用 B+Tree?¶
数据库(如 MySQL、PostgreSQL)通常使用 B+Tree 作为索引结构,而不是:
- 二叉树
- AVL树
- 红黑树
- 哈希表
原因主要有 3 个:
(1)磁盘 IO 更少¶
数据库数据存储在 磁盘页(Page) 中。
B+Tree:
所以树高度非常低:
查询:
(2)范围查询效率高¶
B+Tree 的叶子节点:
结构:
所以:
非常高效。
(3)查询稳定¶
二叉树:
B+Tree:
2. 为什么 B+Tree 高度一般只有 3~4 层?¶
在 MySQL InnoDB 中:
一个节点:
假设:
一个节点可存:
所以:
≈ 10亿数据
因此:
3. 什么是聚簇索引?¶
在 MySQL 的 InnoDB 中:
主键索引 = 聚簇索引
特点:
结构:
例如:
存储在叶子节点。
4. 什么是非聚簇索引(二级索引)¶
二级索引结构:
例如:
查询流程:
这叫:
二、事务与 MVCC(4题)¶
5. 什么是 MVCC?¶
MVCC:
用于:
使用数据库:
- MySQL
- PostgreSQL
6. MVCC 的核心结构¶
MVCC 依赖三个组件:
1️⃣ Undo Log¶
记录:
例如:
Undo log 保存:
2️⃣ 隐藏字段¶
InnoDB 每行数据有隐藏字段:
含义:
3️⃣ Read View¶
Read View 记录:
判断:
7. MVCC 解决了什么问题?¶
解决:
传统锁:
MVCC:
优点:
8. 什么是快照读 vs 当前读¶
在 MySQL 中:
快照读¶
使用:
例如:
当前读¶
读取最新数据并加锁:
或
三、锁机制(2题)¶
9. MySQL 如何解决幻读?¶
理论上:
但 MySQL 通过:
解决。
Next-Key Lock:
例子:
锁住:
别人不能插入:
因此:
10. 什么是 Gap Lock(间隙锁)¶
Gap Lock:
例如:
锁住:
禁止插入:
作用:
四、SQL 执行与优化(2题)¶
11. SQL 执行流程¶
SQL 执行顺序:
例如:
实际执行:
12. 什么是覆盖索引?¶
如果查询字段:
数据库:
例:
索引:
SQL:
查询:
速度非常快。