MySQL语句执行流程

MySQL可以分为Service层和存储引擎层

Service层:连接器、查询缓存、分析器、优化器、执行器

存储引擎层:负责数据的存储和提取

查询语句的执行流程

  1. 连接到数据库

  2. 查缓存(不建议使用,MySQL8.0删除掉)

    MySQL在拿到一个查询请求之后,会先拿到查询缓存中看一下,如果之前执行过的语句,就会以key-value的形式存储被缓存在内存中。key就是查询语句hash之后的值,value就是查询出来的结果。

    • 如果缓存中有,直接返回
    • 如果没有,执行,然后将执行结果存储查询缓存中
  3. 分析SQL语句

    • 词法分析:把一个完整的SQL语句分割成一个个的字符串
    • 语法分析:判断SQL语句是否满足MySQL语法,如果正确就会根据mysql语法规则与SQL语句生成一个数据结构——解析树
    • 预处理器:进一步去检查解析树是否合法,比如表名是否存在,列名是否存在
  4. 优化SQL语句

    根据解析树生成不同的执行计划,然后选择最优的执行计划。

  5. 执行SQL语句

    开始执行之前,要判断这个表有没有执行查询的权限。

    如果有,就使用指定的存储引擎打开表开始查询。

为什么不建议使用MySQL的查询缓存?

  1. 成本高:查询缓存的失效非常的频繁,只要有对一个表的更新,这个表上的所有缓存都被更新
  2. 命中率也不高。

更新SQL的执行流程

  1. 连接到数据库

  2. 查缓存,更新表,这张表的所有缓存全部失效。

  3. 分析SQL语句

    • 词法分析:把一个完整的SQL语句分割成一个个的字符串
    • 语法分析:判断SQL语句是否满足MySQL语法,如果正确就会根据mysql语法规则与SQL语句生成一个数据结构——解析树
    • 预处理器:进一步去检查解析树是否合法,比如表名是否存在,列名是否存在
  4. 优化SQL语句

    根据解析树生成不同的执行计划,然后选择最优的执行计划。

  5. 执行SQL语句

    • 去存储引擎查询需要更新的数据,存储引擎判断当前缓冲池中是否存在需要的数据,存在就直接返回,否则去磁盘加载
    • 存储引擎更新修改到内存中
    • 存储引擎记录redo日志,将状态设置为perpare状态
    • 通知执行器,修改完毕,提交事务
    • 写入bin log,将redolog改为commit状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值