MySQL Server 层负责连接、权限、SQL 解析和优化,InnoDB 存储引擎负责记录、索引、事务、锁和崩溃恢复。理解两层边界,才能分清慢 SQL、事务和日志问题发生在哪里。
一条更新语句经过什么
1 | 客户端发送 SQL |
这是简化链路。实际提交还涉及日志刷新策略和两阶段提交等机制。
聚簇索引与二级索引
InnoDB 的聚簇索引叶子节点保存整行数据,通常按主键组织。二级索引叶子节点保存索引列和主键值,查到主键后可能还要回到聚簇索引取其他字段,也就是常说的回表。
因此主键应稳定、短小且尽量递增。宽主键会进入每个二级索引,放大存储和写入成本。
MVCC 与 Undo
MVCC(Multi-Version Concurrency Control,多版本并发控制)让一致性读可以根据事务视图读取合适的历史版本,减少普通读写之间的阻塞。旧版本信息来自 Undo Log。
Undo 还用于事务回滚;长事务会阻止旧版本及时清理,导致 Undo 膨胀,所以只读事务也不应无期限保持打开。
Redo 与 Binlog
| 日志 | 所属层 | 主要用途 |
|---|---|---|
| Undo Log | InnoDB | 回滚和构造历史版本 |
| Redo Log | InnoDB | 崩溃恢复已提交修改 |
| Binlog | MySQL Server | 复制、审计和时间点恢复 |
Redo 不是备份,Binlog 也不能替代完整备份。可靠恢复需要定期备份、日志保留和恢复演练。
utf8mb4 与 Collation
字符集决定字符怎样编码,Collation(排序规则)决定字符串怎样比较和排序。新系统应明确使用 utf8mb4,不要含糊地写 utf8。
1 | CREATE TABLE users ( |
ai、ci 等后缀会影响重音和大小写是否敏感。账号、编码和业务唯一键应根据真实比较语义选择,不要只复制默认值。
N+1 查询
先查询 100 个用户,再循环查询每人的订单,会产生 101 次 SQL。可使用 Join、批量 WHERE IN、ORM 预加载或专门读模型减少往返,但也要避免一次 Join 拉出巨大的笛卡尔式结果。
1 | SELECT id, user_id, amount |