当前位置: 首页 > news >正文

一条SQL语句的执行过程(附一次两段式提交)

一条SQL语句的完整执行过程是怎样的呢?我们用select和update语句来举例。

注意在mysql8后,进入服务层后,取消了去查询缓存(属于Server服务层)这个步骤,缓存中key是SQL语句,value是值,这样其实并不会提升性能,因为只要有修改语句,缓存数据就无效了,下面我们以mysql8为例子:

1.select语句

  • 建立连接,首先经过连接层,连接器会校验你的用户名和密码是否正确,之后,会查询当前用户的权限。

  • 进入服务层,解析器则会解析此SQL语句,进行语法分析等待,之后优化器会对sql语句进行优化,比如使用什么索引,然后就是执行器去执行SQL语句了,执行前还得判断此用户的权限

  • 如果是innodb引擎,先去BufferPool缓冲池(属于存储引擎)中查看是否存在对应数据,如果没有,存储引擎与磁盘进行交互,将查询结构先存入缓冲池,然后再返回。

2.update语句

比如 update user set name = "张三" where id = 2

  • 前面与select语句过程一样,查出id为2的这行记录。

  • 执行器拿到数据后,将name值改为张三。

  • 先将这次数据修改更新到缓冲池中,同时记录内存中的redolog日志以及binlog日志,根据redolog的刷盘策略,可能也会刷新到磁盘中的redolog日志。

  • 收到事务commit提交指令。(在此刻如果发生宕机,由于事务不是prepare状态,认为事务没有执行完毕,所以不会恢复)

  • 刷新内存redolog到磁盘中的redolog日志,并将事务状态改为prepare,日志中记录的数据状态此刻为prepare。

  • 将内存缓存中的binlog日志刷新到磁盘binlog日志。

  • 刷新内存redlog到磁盘中的redolog日志,将事务状态改为commit,redolog日志中记录的数据状态为commit。

  • 返回事务执行结果。

http://www.lryc.cn/news/158617.html

相关文章:

  • Python基础知识详解:数据类型、对象结构、运算符完整分析
  • 基于Streamlit的应用如何通过streamlit-authenticator组件实现用户验证与隔离
  • [虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
  • 2023数学建模国赛选题建议及BC题思路
  • vue3:4、组合式API-setup选项
  • 【C刷题训练营】第三讲(c语言入门训练)
  • 简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险
  • 2023年9月NPDP产品经理国际认证报名,找弘博创新
  • 【MySQL】MySQL的安装,登录,配置和相关命令
  • 攻防世界-WEB-php_rce
  • WRFDA资料同化实践技术
  • C++11新特性② | 左值、左值引用、右值与右值引用
  • Python Opencv实践 - Harris角点检测
  • el-upload上传图片到七牛云或阿里云
  • Web jQuery—选择器、样式和效果
  • Java和Kotlin的Field在继承中的不同表现
  • MySQL 子查询
  • Ubuntu离线或在线安装CMake
  • 后端面试话术集锦第 十七 篇:MySQL面试话术
  • < 文件资源管理器 > 和 < 此电脑 > 有什么区别?
  • 线上问诊:可视化展示
  • 如何选择合适的HTTP代理服务器
  • Car Window Control Reset
  • 序列号序列号
  • SSM(Spring-Mybatis-SpringMVC)
  • MySQL——数据的删除以及MySQL中的约束
  • 静态路由 网络实验
  • 数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度
  • 【Redis】Bitmap 使用及应用场景
  • C#,数值计算——用于积分函数与方法的Stiel类的计算方法与源程序