MySQL篇|02一条SQL执行的历程

这是我参与更文挑战的第28天,活动详情查看: 更文挑战mysql

当打开某一个数据库客户端,链接数据库,输入一条SQL语句,点击执行后输出其结果。执行的过程当中,发生了什么?sql

客户端与 MySQL 的交互过程的原理图,以下图所示。数据库

CgotOV14ySKAMxohAAH2VHcAzkE612.png

查询语句的轨迹

一条查询语句的轨迹是怎么样的?缓存

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

相关文章
相关标签/搜索