mysql底层运行机制

mysql sql语句执行流程

mysql的sql语句执行流程分为 server层和引擎层

server层是所有存储引擎共享的

引擎层是由不同的存储引擎构成的,例如innodb,myisam和memory等

server层

连接器: 客户端和服务端建立连接,对user表进行校验密码权限是否正确,默认长连接时间为8小时

分析器:分析一条sql语句是否合法

优化器: 表里面存在多个索引的时候,判断优先走那个索引,对sql语句进行优化

执行器: 判断这个表有没有对应的权限,如果有就去查询每一行,把符合条件的放入结果集,然后调用表结构对应的执行引擎

binlog日志:记录sql语句的增删改查,用于主从同步,数据库丢失数据的恢复


mysql默认存储引擎是innodb,通过执行器,调用Innodb存储引擎来查询对应的值


innodb存储引擎
比如我们对这个sql语句进行分析
update biao name='张三' where id=1


1. 将磁盘页id=1的数据,放入内存中(buffer pool缓存池)
2. 将当前要修改的数据放入undolog日志文件中,当事务失败回滚的时候,就用这个来回滚
3. 将内存(buffer pool缓存池)的数据进行修改成 张三
4. 将内存(buffer pool缓存池)的数据放入到redolog的缓冲区中
5. 当redolog缓冲区的数据达到一定量的时候,就会准备提交事务,把redolog的数据写入到磁盘中
6. 将server层的binlog日志写入到磁盘,并准备提交事务
7. 当server层的binlog的数据写入成功之后,binlog会给引擎层的redolog发送一个commit的提交标记,来保证数据的一致性
,这时候才提交事务,但是内存(buffer pool 缓存池)的数据 还没有真正写入到磁盘
8. 当事务提交后,mysql会在后台通过一个io线程,来进行随机的刷盘,把内存(buffer pool缓存池)的数据写入到磁盘

redolog和binlog的区别
1.当数据全部丢失的时候,我们可以使用binlog来恢复数据
2.但是如果只有几条数据丢失,那么我们就需要使用redolog来恢复
3.redolog只记录未刷盘的数据,他属于innodb存储引擎层
4.binlog不会关心是未刷盘还是已经刷盘,如果使用binlog来恢复数据,
那么就得全部覆盖一遍,数据会出现重复,属于server层
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值