作者:chuntianhuaji | 来源:互联网 | 2020-12-03 19:09
mysql教程栏目带大家了解InnoDB的Checkpoint技术。
如图redo log 的不可用是因为当前数据库对其设计都是循环使用的,所以其空间并不是无限大。
当redo log被写满, 因为此时系统不能接受更新, 所有更新语句都会被堵住。
此时必须强制产生Checkpoint需要将 write pos 向前推进,推进范围内的脏页都需要刷新到磁盘
Checkpoint 的种类
Checkpoint发生的时间、条件及脏页的选择等都非常复杂。
Checkpoint 每次刷新多少脏页到磁盘?
Checkpoint每次从哪里取脏页?
Checkpoint 什么时间被触发?
面对上面的问题,InnoDB存储引擎内部为我们提供了两种Checkpoint:
FuzzyCheckpoint发生的情况
Master Thread Checkpoint
差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。
这个过程是异步的,即此时InnoDB存储引擎可以进行其他的操作,用户查询线程不会阻塞
FLUSH_LRU_LIST Checkpoint
因为LRU列表要保证一定数量的空闲页可被使用,所以如果不够会从尾部移除页,如果移除的页有脏页,就会进行此Checkpoint。
5.6版本后,这个Checkpoint放在了一个单独的Page Cleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,该值默认为1024
Async/Sync Flush Checkpoint
指的是redo log文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的
5.6版本后不会阻塞用户查询
Dirty Page too much Checkpoint
即脏页的数量太多,导致InnoDB存储引擎强制进行Checkpoint。
其目的总的来说还是为了保证缓冲池中有足够可用的页。
其可由参数innodb_max_dirty_pages_pct控制,比如该值为75,表示当缓冲池中脏页占据75%时,强制进行CheckPoint
总结
因为CPU和磁盘间的鸿沟的问题,从而出现缓冲池数据页来加快数据库DML操作
因为缓冲池数据页与磁盘数据一致性的问题,从而出现WAL策略(核心就是redo log)
因为缓冲池脏页的刷新性能问题,从而出现Checkpoint技术
InnoDB 为了提高执行效率,并不会每次DML操作都和磁盘交互进行持久化。而是通过Write Ahead Log 先策略写入redo log保证事物的持久化。
对于事物中修改的缓冲池脏页,会通过异步的方式刷盘,而内存空闲页和redo log的可用是通过Checkpoint技术来保证的。
更多相关免费学习推荐:mysql教程(视频)
以上就是了解InnoDB的Checkpoint技术的详细内容,更多请关注 第一PHP社区 其它相关文章!