MySQL数据库请求底层执行过程

一:数据库请求到获得结果过程:
1.用户发起请求经过数据库连接池与MySQL服务器建立连接(长连接)。数据库线程获取到SQL语句
2.分析/解析器对SQL进行分析解析,将SQL语句转换为抽象语法树。
3.预处理器进行语义校验,语义校验就是对查询的表、select投影列字段进行校验,判断表、字段是否存在等。
4.优化器通过MySQL的数据字典和统计信息的内容,经过一系列运算 ,最终得出一个执行计划,包括选择使用哪个索引。
5.执行器开始执行SQL语句。执行器最终就是根据一系列的执行计划去调用存储引擎提供的API接口去调用操作数据,完成SQL的执行。
6.开始执行的时候,要先判断一下建立连接的对象对这个表有没有执行操作的权限,如果没有,就会返回没有权限的错误;如果有,就按照生成的执行计划进行执行。
7.MySQL 支持插件式的存储引擎,包括 InnoDB 、MyISAM、Memory 等。一般情况下,MySQL默认使用的存储引擎是 InnoDB。InnoDB存储引擎整体分为内存架构和磁盘架构。
8.Buffer Pool是 InnoDB 存储引擎中非常重要的内存结构,起到一个缓存的作用。MySQL 的数据最终是存储在磁盘中的,如果没有 Buffer Pool,那么每次的数据库请求都会磁盘中查找,
这样必然会存在 IO 操作。但是有了 Buffer Pool,只有第一次在查询的时候会将查询的结果存到 Buffer Pool 中,这样后面再有请求的时候就会先从缓冲池中去查询,如果没有再去磁盘中查找,然后在放到 Buffer Pool 中。
二:保持数据一致性:
必须知道的三个日志文件:
1.undo日志文件:记录数据被修改前的样子
2.redo日志文件:记录数据被修改后的样子(存储引擎级别,适用于崩溃恢复)
3.bin log日志文件:记录整个操作过程(MySql级别,适用于主从复制和数据恢复)
(1)首先MySQL执行器根据 执行计划 调用存储引擎的API查询数据
(2)存储引擎先从缓存池buffer pool中查询数据,如果没有就会去磁盘中查询,如果查询到了就将其放到缓存池中
(3)在数据加载到 Buffer Pool 的同时,会将这条数据的原始记录保存到 undo 日志文件中
(4)innodb 会在 Buffer Pool 中执行更新操作
(5)更新后的数据会记录在 redo log buffer 中
(6)提交事务在提交的同时会做以下三件事
(7)(第一件事)将redo log buffer中的数据刷入到redo log文件中
(8)(第二件事)将本次操作记录写入到 bin log文件中
(9)(第三件事)将bin log文件名字和更新内容在 bin log 中的位置记录到redo log中,同时在 redo log 最后添加 commit 标记
(10)使用一个后台线程,它会在某个时机将我们Buffer Pool中的更新后的数据刷到 MySQL 数据库中,这样就将内存和数据库的数据保持统一了

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值