mysql一条sql语句的执行过程

体执行流程

参考文章:
https://mp.weixin.qq.com/s?__biz=MzIwNTc4NTEwOQ==&mid=2247491060&idx=1&sn=d8915cb1cf433d59c79a24ac85884e40&chksm=972acc8ea05d4598ca33fe397be7247770a229cc51d20df4b6e98e010591a81b441478245851&scene=132#wechat_redirect

https://mp.weixin.qq.com/s/voW6T241-00DAPpgrh-STw

https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650155867&idx=4&sn=2e1498a550ca39c879e24e848994b560&chksm=f368367ac41fbf6cf338fa3e1aac7b356738713bd7492eae4f2f061f1043170de7ffdaa4dcc2&scene=132#wechat_redirect

更新update语句:
服务端执行sql语句->服务端数据库连接池获取数据库连接->mysql连接池->mysql线程->sql语句交给sql接口->sql解析器->sql优化器->sql执行器调用存储引擎执行sql语句->查询缓存池是否有该条数据,没有的话从磁盘中读取放入到缓存池->将未更新前数据放入到undolog日志文件中->更新缓存池中数据记录->将更新操作记录到redo log buffer中->提交事务->将redlo log buffer中的记录刷入到磁盘redolog文件中->将更新信息记录到binlog文件中->将binlog文件名称以及更新内容在binlog文件中具体的位置记录到redolog文件中,同时在redolog文件最后加入commit记录->后台线程将缓存池中修改的内容刷入到磁盘中。

下面详细介绍一下每一步执行的操作:

服务端数据库连接池获取数据库连接:常见的数据库连接池:druid、dbcp、c3p0、hkricp(目前springboot默认使用的数据库连接池)。
mysql连接池:维护自身的连接池,避免频繁的线程创建和销毁,造成性能的消耗。

sql解析器:将sql语句解析成mysql能够自己识别的语言。

sql优化器:按照执行成本最低原则选择合适的执行计划,执行成本考虑两方面,一个是IO一个是CPU。IO成本指的是将数据以数据页倍数加载到内存中,CPU成本指的是将查看出数据与查询条件对比,获取需要的数据。接下来,将生成的执行计划交给存储引擎。

sql执行器:调用存储引擎执行sql语句。

缓存池(buffer pool):缓存池是一段内存空间,由控制信息和缓存也组成,控制信息在前,缓存页在后,并且控制信息和缓存页一一对应。sql语句不会直接操作磁盘,而是操作缓存池,比如更新语句,首先回去缓存池中查找是否存在,不存在话从磁盘中加载出来,放到缓存池中。缓存池中有三个链表,一个是free空闲链表,一个是lru链表,一个是flush链表。
free链表维护的是空闲页,当mysql启动时候,会初始化缓存池,同时为了知道缓存池中哪些缓存页可以使用,通过free链表来管理,free链表中每个节点存储的缓存页控制块内存地址,而缓存页控制块对应一个缓存页,所有free链表每个节点跟缓存池中空闲页也是一一对应的。

lru链表用来管理读取的页,当有数据读取时,lru链表会从free链表申请一个页,将从磁盘读取数据页放入到lru链表中。

flush用来管理修改的页,当数据页第一次被修改时,flush链表会存入一个节点,存储的是指向lru链表的指针,只有第一次修改的时候,才会存储,非第一次时直接在lru链表中修改。

sql语句未交给执行引擎前发生流程:

在这里插入图片描述

将sql语句交给执行引擎后发生流程:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值