bufferpool binlog undolog redolog 二阶段提交

数据是需要存储到磁盘上的,是以数据页(16KB)为单位存储

首先思考个问题,随机写

现在数据库表中有1000w条数据,然后我批量更新

update set xx where id in(1,34,55,89,8999)

这就会导致随机写(数据分布在磁盘中各个位置)

导致的问题就很慢,非常慢,那每次都要修改个七八百条数据,mysql还要不要活了?

怎么解决?

1.想办法给他搞成顺序写(连续的空间,不用考虑位置了)保护磁盘

2.既然慢那就想办法搞一个写内存

3.既然有内存的存在,就得考虑持久化了;因为数据基于内存会有丢失的风险,比如redis就是基于内存的框架,无论你持久化配置的再好,那也会有丢失的风险,那我们为啥没听说过mysql会有数据丢失呢?

mysql为了避免随机写造成的性能问题的优化

1.buffpool

2.WAL机制 (写日志)

3.redolog binlog二阶段提交

4undolog

sql执行语句的流程图

1.sql进来后,磁盘会以数据页为单位把数据加载到bufferpool内存中

2.写一个undolog日志

3.写redolog,然后预提交(pre commit)如果这时候宕机,根据undolog进行回滚

4.写binlog日志------如果这个时候宕机,会进行前滚,他会看redolog已经预提交了,那他会帮着进行二阶段的真正提交

5.redolog 真正的提交----如果这个时候宕机,因为还没有将数据刷到磁盘,redolog会和磁盘的数据页进行合并

6异步刷新到磁盘

7.返回成功

总体来说上面的操作都在做什么?这么麻烦还得写这么多日志,还要加载缓存 

就是为了保护磁盘,防止随机写造成的性能问题

redis:为了保护数据库

bufferpool:为了保护磁盘

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值