当打开某一个数据库客户端,连接数据库,输入一条SQL语句,点击执行后输出其结果。执行的过程中,发生了什么?
客户端与 MySQL 的交互过程的原理图,如下图所示。
查询语句的轨迹
一条查询语句的轨迹是怎么样的?
select id from bas_student;
- 客户端通过MySQL的Client Connection建立连接
- 查询缓存。前提是开启查询缓存功能。开启了,在查询缓存过程中查询到完全相同的SQL语句时将查询结果直接返回给客户端,未开启或未查到数据则进入下一步
- 前提是未开启查询缓存或开启了却没查到数据,进入解析器进行语法语义解析,生成解析树
- 预处理器生成新的解析树
- 查询优化器生成执行计划,其实就是选择最优的查询路径
- 查询执行引擎执行SQL语句,通过执行器组件去执行,其根据执行计划,调用存储引擎的各种接口去执行SQL语句,查询到数据后不仅把结果返回给客户端,也将结果保存到查询缓存中
更新语句的轨迹
一条更新语句的轨迹时怎么样?
update bas_student set name = 'jasen' where id= 2021;
和查询语句的执行轨迹基本一致,但更新语句会涉及两个重要的日志模:redo log 重做日志 和 bin log 归档日志。
redo log prepare
- 存储引擎将新记录更新到内存中,并将这个操作记录到redo log中,此时redo log 处于prepare状态,随时可以提交事务。
bin log
- 执行器生成操作的bin log 并将bin log写入磁盘
redo log commit
- 执行期调用引擎提交事务的接口,将redo log 状态改为commit
扩展
查询缓存功能很薄弱,MySQL8.0已废弃查询缓存功能
如果开启查询缓存,SQL语句必须完全都一摸一样,才能查到该结果,对于更新语句一摸一样的数据会比较少,且对于表中的数据如果更新了,该表的缓存也会失效。