这是我参与更文挑战的第28天,活动详情查看: 更文挑战mysql
当打开某一个数据库客户端,链接数据库,输入一条SQL语句,点击执行后输出其结果。执行的过程当中,发生了什么?sql
客户端与 MySQL 的交互过程的原理图,以下图所示。数据库

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