二、MySQL整体概述 之存储引擎

二、MySQL整体概述 之存储引擎
文章非原创,都是堆以往看到接触到的资料进行汇总归纳,文章可能存在大段截取其他文章的片段,文章属于自己学习知识的总结会不断更新
在这里插入图片描述
按照上文的介绍,

(一、MySQL整体结构概述 之Server层)

假设执行器根据计划调用存储引擎的读写接口直接操作磁盘上的数据的话,是不现实的,如果每条SQL语句都要操作一下磁盘的话,IO开销太高,会影响mysql整体的性能,导致吞吐与并发的能力下降。因此存储引擎中存在一个缓存数据的区域,缓冲池(buffer pool)。
1.缓冲池(Buffer Pool)
缓冲池的意义在于,将磁盘中的数据先缓存起来,减少直接操作磁盘带来的IO 开销,提高数据的读写效率。
2.undo日志文件
在处理数据的时候,考虑到未来回滚的需要,会先把原来的数据放到undo 日志文件中
3.Redo Log Buffer 缓冲区
我们在缓冲池中对数据进行更新后,此时磁盘还是原来的数据,那缓冲池中更新的数据就是脏数据。这个时候如果数据库所在的机器宕机了,必然导致数据丢失。因此我们需要把对内存所做的修改写入到一个Redo Log Buffer里去,这也是内存里的一个缓冲区,是用来存放redo日志的。他主要是记录“对哪个数据页中的什么记录做了什么修改”(此时事物是没有提交的,假如此时mysql崩溃,内存中Buffer Pool中修改过的数据以及Redo log 中的日志都会丢失。但对于我们来说其实是没有什么影响的,因为这种情况下只是说你内存中修改后的数据丢失了,但磁盘中的数据还是原来的数据。因此对于我们而言相当于是sql没有执行成功而已。)数据操作完成后,我们想要提交事务了,此时就会根据一定的策略把redo 日志刷入磁盘文件中,该策略是通过innodb_flush_log_at_trx_commit来配置的,它的值分别有0、1、2。为0时提交事务时不会将日志刷入磁盘,为2时 提交事务日志会先进入os cache中,数据库宕机都会导致数据丢失,为1时 提交事务必须将日志刷入磁盘中,数据库宕机就可以根据日志来恢复数据。所以建议设置为1即可。
4.binLog
除了InnoDB存储引擎的redo日记以外,还存在一个server层的日志binLog 前者是InnoDB独有的 后者是mysql共有的。binlog叫做归档日志,他主要是记录“XX表中Y字段 = 某某的数据做了什么操作,更新后的值是多少” 提交事务的时候同时会写入binlog并吧此时更新对应的binlog写入磁盘。
binlog刷入磁盘文件由参数sync_binlog控制,默认值为0 提交事务时文件先放os cache中 宕机数据就丢失,设置为1 提交事务就刷入磁盘中。binlog写入磁盘后,就会进行最终的事务提交,会把本次更新对应的binlog文件名称与本次更新的binlog日志在文件中的位置,都写入redo日志文件中,同时在redo日志文件里写入一个commit标记。
在redo日志文件中写入commit标记的意义在于保持两个日志文件一致,如果没有写入此标记时宕机了,我们 认为此时事务提交是失败的。
5.binlog与Redo log 的区别

  • redo log是InnoDB引擎特有的,binlog是server层实现的所有引擎共有
  • redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
  • redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

6.事务提交成功
现在事务提交成功了,redo日志 binlog日志都已经刷入磁盘了,缓冲池中的数据已更新,mysql中有一个后台IO线程会在之后的某个时间里,随机将缓冲池中的数据刷入磁盘中。

下一篇介绍:三、MySQL整体概述 之缓冲池(Buffer Pool)
(笔记我放在为知笔记(爸爸请打钱 【狗头】)上的,上传后,我再回来加个连接。机(ma)智(de)如(zhi)我(zhang)!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值