buffer pool:
内部是以页(16K)为单位
包括:
数据页、索引页、修改缓冲区、自适应hash索引、锁信息、数据字典
其中数据页、索引页采用LRU算法(最近最少使用)
修改缓冲区(change buffer):辅助索引的更新时,先放到修改缓冲区中,等数据库空闲时进行合并。
使用场景:插入、修改、删除
目的:减少磁盘IO
redo log buffer
记录当前事务中对数据库的操作。事物完成之前事物所有的操作需要刷新到磁盘中(redo log)
分为三个模式(innodb_flush_log_at_trx_commit)
0:定时写入磁盘
1:事务结束时,调用fsync(实时写入)
2:事物结束时,不调用fsync,由文件系统判断时机写入磁盘
其中1保证数据不会丢失。
内存数据落盘
数据更新时,再内存中更新,并不会实时更新到磁盘中,内存中数据与磁盘中数据不一致(脏页)。
InnoDB落盘时机:
强制落盘:数据库关闭时执行
模糊落盘:
1、定时落盘
2、buffer pool再执行LRU算法时,数据页打到一定阈值,执行落盘
3、redo log使用率>75%执行异步落盘,>90%执行同步落盘
4、脏页太多,执行落盘
落盘双写:
1、脏页写入双写缓冲区
2、双写缓冲区写入系统表空间的双写缓冲区
3、写入用户表空间,然后再执行1
双写原因:防止小概率数据写时损坏事件