innodb事务-持久性

原创
2021/07/13 15:20
阅读数 201

innodb事务-持久性

从mysql5.5开始,将默认的存储引擎修改为innodb,因为innodb事务的特性,能运用各种大量的场景,并且性能比较好。

事务的4个特性是ACID,即

  • A 原子性
  • C 一致性
  • I 隔离性
  • D 持久性

我们这里主要来看持久性。

我们都知道软件世界存在的量大耗时操作,一个是文件I/O,一个是网络I/O。

而innodb在持久性方面就是为了解决I/O问题。

解决问题

频繁的I/O操作是一个非常耗时的过程,这是相对于内存等操作而言,但是我们的各种数据都是存在于磁盘上,就无法避免和磁盘进行交互操作。innodb为了保证性能,选择了先将数据保持到内存,然后再保持到磁盘。

但是要实现先保存到内存,再存到磁盘,这个过程增加了一个环节,那么就会衍生出各种问题,最明显的问题就是如果数据存到内存中,这个时候机器宕机了,没有写到磁盘上,怎么办?

innodb为了最大化的保证数据不丢失,采用了Write-Ahead-Log的思路,即Redo Log。

事务持久性的实现

innodb事务持久性

关键说明

Page

操作系统一个默认Page是4KB,而mysql的一个Page默认是16KB。

Redo Log

在innodb中Redo Log文件设置的默认值是48M,当然,这个值可以根据实际情况进行调优修改。

而一个Redo Log Block是512字节,因为早期的磁盘一个扇区就是512字节。

只要当Page数据一但写入到磁盘中,Redo Log其实就没有什么用了,所以Redo Log不是无限增长的,而是固定大小,循环重复使用,所以这就是为啥默认设定为48M的原因。

参考资料

  1. 《软件架构设计:大型网站技术架构和融合之道》
  2. MySQL innodb_page_size
  3. mysql的两阶段提交原理
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部