MySQL(二)查询执行流程

下图是MySQL查询路径

在这里插入图片描述
半双工,a向b发送,等到b接收完成后才能响应,然后才可以发下一条指令
比方对讲机,你说完,另一个人才能说
在这里插入图片描述
select * from user where username=‘123’;
连接时间可以修改,这些参数都可以在官网上查找到的,不用记
在这里插入图片描述
在这里插入图片描述
查询缓存,先去查询缓存,直接返回结果(sql语句和之前的一样)
在这里插入图片描述
默认关闭,打开/etc/my.cnf文件进行配置query_cacha_type=1开启,0关闭
在这里插入图片描述
可以查看缓存相关情况
在这里插入图片描述
Qcache_hits 缓存命中次数
Ocache_inserts 插入条数

一般不会开启缓存,所以不用重点关注,8.0之后没有了
在这里插入图片描述
解析器解析为解析树, 打碎,拆分。词法解析,语法解析。
在这里插入图片描述
一条sql语句在服务端有很对执行路径的。优化器生成不同执行路径。任何数据库都会有优化器。
优化器(有很多语法优化,如子查询优化)根据解析树生成不同的执行计划,选择一种开销最小的方式
可以打开监控,默认关闭,需要修改为on 开启状态。打开后一条sql语句如何生成执行计划很详细
在这里插入图片描述
在这里插入图片描述
执行语句后查询这个表,会记录执行过程,是一个json格式

在sql语句前面加上explain,可以看到执行计划

数据放在table中,存储引擎
我们可以查看每张表的存储引擎
show table status from 数据库;可以看到每个表使用的存储引擎,我们也可以修改存储引擎

优化完成后,通过查询执行引擎区操作存储引擎(api),然后返回数据
在这里插入图片描述

模块结构

在这里插入图片描述
上面是查询语句的执行流程,那么一条更新语句如何执行?
数据都是放在磁盘上的,把磁盘数据加载到内存,InnoDB有个单位是页(16K)
InnoDB中使用了缓存池技术,buffer pool,下一次读取时判断我们操作的页是否在缓存池中,当修改的时候,我们会修改内存数据,当发现内存数据和磁盘数据不一致时,我们称之为脏页,如何同步到磁盘中呢?这个动作叫刷脏,
buffer poll内部可以分为几块
内存结构和磁盘结构,buffer poll是内存结构,默认大小128M,缓存的是数据信息,数据页和索引页
在这里插入图片描述
内存写满怎么办,BufferPool使用LRU算法,内存淘汰算法,将不是热点数据的删除,留下来的是热点数据
change buffer,修改记录记入其中,然后再把其同步写入磁盘,merge,
后台线程定时会把内存中数据同步到磁盘,如果有查询先同步到磁盘
redolog写满时候,也会把change buffer中数据写入磁盘
redo log 先写日志,再写入磁盘

随机IO,内存到磁盘文件是随机IO,速度慢
而记录日志是顺序IO
顺序IO,数据都是相邻的,依次访问就可以,效率高,所以先写入redo logo
在写入redo log之前,先写入log buffer(buffer pool里),redo log主要是做回复的

redo log只在InnoDB
物理日志
redolog大小固定(48M)
在这里插入图片描述
undo逻辑日志
加起来叫事务日志

更新语句流程

1.从磁盘或者内存中取到数据
2.执行器会把数据的值改
3.记录日志undo 和redo log
4.buffer pool把修改写进去
5.然后再写入磁盘

在服务层也有一个日志文件bin log
逻辑日志,记录sql语句,数据恢复,主从复制,用bin log实现的
在这里插入图片描述
redo分成两个阶段来写,先把状态设置为prepare,然后告诉server层可以提交事务了,server层先写入binlog,然后将提交指令告诉redo,将其状态设置为commit。

为啥使用两个阶段提交

使用两阶段提交,写入binlog发生异常也不会有影响,因为mysql根据redolog恢复数据时,发现状态是prepare,并且没有对应的binlog,就会回滚该事务。

为了让两份日志之间逻辑一致。

redolog和binlog区别

redolog是innodb特有的,binlog都有
redolog是物理日志,记录的是在某个数据页上做了什么修改,binlog是逻辑日志,记录的是这个语句的原始逻辑
redolog固定大小,会用完。binlog可以追加,写到一定大小回切换到下一个
redolog持久性,崩溃恢复能力,binlog保证mysql集群数据一致性。
binlog提交事务才写入,redolog在事务执行过程中不断写入。写入时机不同

六大日志文件

二进制日志,错误日志,慢查询日志,通用查询日志,Mysql8又增加两种,中继日志,数据定义语句日志
在这里插入图片描述
binlog日志,二进制日志
mysqlbinlog工具从指定时间点开始直到现在活着另一个指定时间点的日志中恢复数据

首先flush logs
show binary logs看到生成一个新的binlog文件
接下来恢复行为记录到这个新文件里面了

开始读binlog文件
show binlog events in ‘binlog日志文件名’;
找到要恢复的position的数,比方开始884 结束1729
在这里插入图片描述
通过时间,查看是mysqlbinlog ‘文件路径’,找到时间,使用下面命令进行恢复。
在这里插入图片描述
binlog多了,删除,删除部分数据
在这里插入图片描述
在这里插入图片描述
二进制日志恢复数据很有挑战性,起止位置不容易管理。
所以我们用主从备份,或者一主多从,将二进制日志文件内容通过中继日志同步到从数据库服务器中。

中继日志

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值