1.InnoDB中每一页的大小默认为16kb,但是其也支持压缩页的功能,即将原本16kb的页压缩为1kb、2kb、4kb和8kb。当需要从缓存池中申请4kb大小的页时,MySQL的申请步骤如下:
- 检查4kb的unzip_LRU列表,检查是否有可用的空闲页;
- 若有,则直接使用;
- 否则,检查8kb的unzip_LRU列表;
- 若能够得到空闲页,则分解为2个4kb的页,并且存放到4kb的unzip_LRU列表;
- 若不能得到空闲页,就从LRU列表中申请一个16kb的页,将其分解为1个8kb和2个4kb的页,并且存放到对应的unzip_LRU列表中。
2.当LRU列表中的页被修改之后,其数据就和磁盘上的数据产生了不一致,这种页被称为脏页,此时数据库会根据checkpoint机制将脏页刷新到磁盘中,脏页不仅存在于LRU列表中,也存在于FLUSH列表中,FLUSH列表中的数据是专门用来管理将数据刷新到磁盘中的。
3.在下列三种情况下重做日志会将重做日志缓冲中的内容刷新到重做日志文件中:
- master thread每一秒将重做日志缓冲刷新到重做日志文件;
- 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
- 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。
4.为了避免数据丢失的问题,事务数据库都采用了write ahead log机制,也就是当事务提交时,存储引擎先将数据写入到重做日志中,然后再修改页中的数据,当数据库发生宕机时,可以通过重做日志来恢复数据。
5.为了协调CPU的处理速度与磁盘的读写速度之间的不匹配问题,MySQL采用了缓冲池来解决这个问题,当发生数据读写时,其都是先将数据写入到缓冲池中,然后通过checkpoint技术将数据写入到磁盘中。
6.checkpoint技术所解决的问题:
- 缩短数据库的恢复时间;
- 缓冲池不够用时,将脏页刷新到磁盘;
- 重做日志不可用时,刷新脏页。