Innodb存储引擎
一次写入操作是一次事务,innodb 首先把事务数据写入到缓存池 Buffer Pool 和重做日志redo log中,然后就可以提交事务,响应客户端了。之后 innodb 再将新事务的数据异步地写入磁盘,真正存储起来。
Innodb主要是通过事务日志实现ACID特性
事务日志包括:重做日志redo和回滚日志undo
Redo记录的是已经全部完成的事务,就是执行了提交的事务,记录文件是ib_logfile0 ib_logfile1
Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录下表空间中的(共享表空间或者独享表空间)
一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志undo将所有已完成并写入磁盘的未完成事务进行回滚,然后redo中的事务全部重新执行一遍即可恢复数据,但是随着redo的量增加,每次从redo的第一条开始恢复就会浪费长的时间,所以引入了checkpoint机制
1.缓存池 buffer pool
数据的读写需要经过缓存(缓存在buffer pool 即在内存中)
数据以整页(16K)位单位读取到缓存中
缓存中的数据以LRU策略换出(最少使用策略)
IO效率高,性能好(不用IO)
读操作:
数据是以页为存储单位,在缓冲池中缓存了很多数据页,当第一次读取时首先将页从磁盘读取到缓存池中,当下一次再去读相同的数据页时如果该也在缓存池中就直接从缓冲池中读取而不需要再去磁盘读,最理想的方式是将所有的磁盘数据都缓存到缓冲池中但是这得内存足够大才行。
修改操作
innodb存储引擎对数据的修改也是先修改缓冲池中的数据页(如果存在),然后根据一定的频率刷新到磁盘来修改数据文件,这涉及到checkpoint机制。
LRU:
innodb缓冲池中的页默认大小为16KB,缓冲池通过LRU(Latest Recent Used 最新少使用)算法来进行管理,将最频繁的使用的页放在LRU列表的前端,而最近少使用的页放在尾端,当缓存池中的空间不足的时会先删除尾端的页来释放空间,即根据LRU算法溢出最近最少使用的页,若此页为脏页,那么需要强制执行Checkpoint,将脏页也就是页的新版本刷回磁盘。
LRU有一个midpoint位置,默认在LRU的37%的位置,左边表示old列表,右边表示new列表(热点数据),新插入缓冲池中的页先放在midpoint的位置,如果新插入的页一来就移动到new列表的话可能会导致new列表中的某些活动也被移除到old列表中。
2. 重做日志 redo log
重做日志用于实现持久性,由redo log buffer和redo log file两部分组成。
InnoDB提交事务时,先写重做日志,InnoDB存储引擎首先将重做日志信息先放入到重做日志缓冲中,然后按照一定的频率将其刷新到重做日志文件当中。默认缓冲大小是8M,8M基本可以满足需求,不需要配置太大的重做日志缓冲。redo log以512B的块(block)进行存储,称为重做日志块(redo log block)。
刷新机制:
1.Master Thread 每一秒将重做日志缓冲刷新到重做日志文件;
2.每个事务提交时会将重做日志缓冲刷新到重做日志文件;
CheckPoint机制
对数据的操作都是先在缓冲池中完成,缓冲池中的数据页往往比磁盘上的数据页要新,我们将在缓冲池中已经修改但是还未应用到磁盘的数据页叫“脏页”,数据页最终还是需要更新到磁盘中,更新过程中会涉及到CheckPoint机制。
Checkpoint:如果在某个时间点,脏页的数据被刷新到了磁盘,系统就把这个刷新的时间点记录到redo log的结尾位置,在进行恢复数据的时候,这个时间点之前的数据就不需要进行恢复了,可以缩短时间.
在InnoDB存储引擎内部,有两种Checkpoint,分别为:
Sharp Checkpoint
Fuzzy Checkpoint
Sharp Checkpoint:数据库关闭时将所有脏页都刷新回磁盘,默认方式,参数:innodb_fast_shutdown=1
但是,如果数据库在运行的时候也使用Sharp Checkpoint,那么数据库的可用性就会受到很大的影响。所以,在InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新,即只刷新一部分脏页,而不是刷新所有的脏页到磁盘。
Fuzzy Checkpoint:刷新部分脏页,具体分为以下四种情况
1.Master Thread Checkpoint
Master Thread每隔几秒钟从缓冲池中将脏页刷新回磁盘
2.FLUSH_LRU_LIST CheckPoint
在5.6版本之后需要保证LRU默认存在1024个可用页,如果可用页不足1024页刷新部分脏页回磁盘,通过参数“innodb_lru_scan_dapth”配置。
3.Async/Sync Flush Checkpoint
指的是因为重做日志文件空间不足导致的同步或异步刷新脏页回磁盘,当重做日志空间已使用的空间达到75%-90%就触发异步刷新,如果超过90%就触发同步刷新,一般不会触发同步刷新操作,除非重做日志文件太小并且进行LOAD DATA的BULK INSERT操作。
4.Dirty Page too much
保证缓冲池中脏页的比例,当缓冲池中的脏页比例达到75%时就触发刷新脏页操作,通过参数“innodb_max_dirty_pages_pct”配置。