MySQL 探秘笔记
由SQL语句的执行过程引出 MySQL 核心组件
1 | 1.客户端发送 SQL 语句给 MySQL. |
PS: 选取索引只能用一个索引, 除了 union 好像会触发合并索引, 但合并后也算一个索引.
即使是 update 语句也会使用优化器寻找查询计划, 因为当带条件时, 需要先锁定记录, 再进行修改.

几个核心组件的作用
- 连接器: 网络编程建立端口监听, 接收客户端发送的SQL语句
- 分析器: 对SQL进行语法、词法上的分析。
- 优化器: 生成执行计划、选择索引。
- *逻辑转换: *包括否定消除、等值传递和常量传递、常量表达式求值、外连接转换为内连接、子查询转换、视图合并等;
- *优化准备: *例如索引 ref 和 range 访问方法分析、查询条件扇出值(fan out,过滤后的记录数)分析、常量表检测;
- *基于成本优化: *包括访问方法和连接顺序的选择等;
- *执行计划改进: *例如表条件下推、访问方法调整、排序避免以及索引条件下推。
- 执行器: 操作执行引擎,获取SQL的执行结果
- 存储引擎(执行引擎): 负责具体的语句执行, 查询等.
PS: 基数(值某列数据去重后剩余个数, 估算得到) 会被用于分析索引的过滤效果.
然后是存储引擎里面的一些概念
1 | # 存储引擎中 |
事务的实现
1 | # 事务回滚 |
图为回滚对应的 undo 链; 以及隔离级别原理的 ReadView.


MySQL 速记
SQL 优化
索引原理
MySQL 索引一般选择 B+树做为数据结构存储. B+ 树的优点是, 对文件IO的访问次数控制在 3 次, 保证速度的同时, 能存储千万行数据.
索引
1 | 1.对常用列添加索引, 视具体情况选择单一索引或复合索引(一般为复合) |
事务
1 | ACID: |
隔离级别
1 | 1.读未提交: 可读取其他未提交事务的执行结果(如更新了某个字段), 可能会造成读取错误的数据(未提交的事务回滚了), 造成脏读. |
MySQL 默认隔离级别
可重读读
数据库锁
锁原理
1 | 行锁: 分为排它锁(X) 和共享锁(S). 即写锁和读锁. |
锁触发方式
1 | 行锁: 隐式(条件带有索引则锁对应列, 不带索引则锁全部行, RR 总会带有 GAP 锁, RC 不会), 显式(使用 for update, lock in share mode) |