一、MySQL 基础篇
1. MySQL 的架构组成
MySQL 架构通常分为三层,从上到下依次是连接层、服务层和存储引擎层。
连接层主要负责处理客户端的连接请求,包括身份认证(验证用户名密码)以及管理连接池和维护线程。当应用程序发起连接时,首先经过这一层。
服务层是核心层,包含查询缓存、解析器、优化器和执行器等组件。虽然 MySQL 8.0 已移除查询缓存(因命中率低),但其他组件依然关键:
- 解析器:进行词法和语法分析,生成解析树。
- 优化器:选择最优执行计划,比如决定使用哪个索引。
- 执行器:调用存储引擎接口执行 SQL。
存储引擎层负责数据的存储和读取,支持插件式扩展,常见的有 InnoDB 和 MyISAM。
一条 SQL 的执行流程大致为:客户端发送 SQL → 连接器验证 → 解析器解析 → 优化器优化 → 执行器执行 → 存储引擎读写数据。
2. InnoDB 与 MyISAM 的区别
这是最常用的两个存储引擎,主要区别体现在以下几个方面:
- 事务支持:InnoDB 支持 ACID 特性,可 COMMIT/ROLLBACK;MyISAM 不支持事务,出错无法回滚。
- 锁粒度:InnoDB 支持行级锁,并发性能更好;MyISAM 仅支持表级锁,写操作会锁住整表。
- 外键约束:InnoDB 支持外键,保证引用完整性;MyISAM 不支持。
- 索引结构:InnoDB 使用聚簇索引,数据文件与索引绑定,主键叶子节点存数据;MyISAM 是非聚簇索引,数据与索引分离,叶子节点存地址。
- COUNT(*) 性能:MyISAM 保存了总行数,直接返回;InnoDB 需全表扫描统计。
- 崩溃恢复:InnoDB 有 redo log 和 undo log,支持恢复;MyISAM 无此机制,易丢失数据。
目前推荐默认使用 InnoDB(5.5+ 版本起即为默认),除非是只读且无需事务的场景。
3. 聚簇索引与非聚簇索引
聚簇索引(Clustered Index) 的特点是索引与数据存储在一起。InnoDB 的主键索引即为聚簇索引,B+Tree 叶子节点直接存储完整数据行。可以理解为按拼音排序的字典,找到拼音就找到了内容。
非聚簇索引(二级索引) 的叶子节点存储的是主键值。例如在 username 字段建普通索引,查询时需先在索引树中找到主键 ID,再回到聚簇索引中查找完整数据,这个过程叫回表。
回表有性能损耗,因此实际开发中常使用覆盖索引来避免。如果查询字段都在索引中,就不需要回表。
-- 假设有联合索引 idx_name_age(name, age)
SELECT name, age FROM user WHERE name = '张三';
-- 此查询用到覆盖索引,无需回表
InnoDB 要求表必须有主键。若未显式定义,它会优先找非空唯一索引,若无则自动生成 6 字节隐藏主键 ROW_ID。建议始终显式定义自增主键,顺序插入效率更高。
二、索引篇
1. 为什么选择 B+Tree?
相比 Hash 和 B-Tree,B+Tree 更适合数据库场景:

