建设网站项目的目的站长统计app软件
1,Insert Buffer
在InnoDB存储引擎中,对于主键唯一索引,行记录一般按照递增的顺序进行插入,该方式不用磁盘去随机读取另一个页的记录
这样子的顺序插入速度很快。但是对于辅助索引,它不具备有唯一性,顺序性的插入往往还要根据列的具体特性来判断,比如
时间,这样子还稍有一些顺序,但是往往是没有顺序的。
对于非聚集索引的插入和更新的操作,并不是每一次的操作都会去插入到索引页当中去的,而是先判断非聚集索引页是否在缓冲池
中,如果在则直接的插入,但是如果不在那么先放到一个Insert Buffer里面去,然后再以一定的频率和情况进行insert buffer和
辅助辅助索引页子节点合并操作后,将多个插入合并到一个操作当中去,提供插入的性能
2,Change Buffer
Change Buffer与Insert Buffer一样,适用对象还是非唯一的辅助索引
对于一条Udate操作可能氛围以下的两个过程:
I. 将记录标记为删除
II.真正的将记录删除
3,Insert Buffer的内部实现
在Mysql中全局只有一个Insert Buffer B+树,负责对所有的索引进行Insert Buffer,存放在共享表空间中。
Insert Buffer B+树:
非叶子节点:用于存放查询search Key值
Space区: 用于存放待插入记录所在表的表空间ID,在Innodb中每个表都有一个唯一的space id
marker区: 用于兼容老版本的Insert Buffer
Offset区:用于兼容页所在的偏移量,一个辅助索引的定位通常只需要表空间ID+偏移量
如果页不在缓冲池,创建一个search key:
metadata区:
IBUF_REC_OFFSET_COUNT 2bits: 用来排序每个记录进入到Insert Buffer的循序
IBUF_REC_OFFSET_TYPES 1bits
IBUF_REC_OFFSET_FLAGS 1bits
secondary index record: 实际插入记录的各个字段
BitMap
通过表空间ID+偏移量定位,用于标记每个辅助索引页的可用空间
4,Merge Insert Buffer
前面有说到了Insert Buffer提供了一定的频率和情况进行insert buffer和辅助辅助索引页子节点合并操作,但是什么时候进行合并通常记录
在以下三个情况下:
1,辅助索引页被读取到缓冲池中
2,Insert Buffer bitMap追踪到该辅助索引没有可用的空间
3,Master Thread
5,doubleWrite(两次写)
需要两次写的原因:重做日志是对页层面的物理操作与备份,但是如果当页坏了的时候,那么这时候重做日志去重做是没有意义的,所以用户需要
一个副本,在页损坏的时候,用副本页去还原原本的页,然后再进行重做日志。
doubleWrite组成:
1. doubleWrite buffer
2,物理磁盘上共享表空间的128个页
6,刷新邻近页
当刷新一个脏页时,InnoDB会检测当前页所在区的所有页,如果有脏页那么会一起刷新
7,启动与关闭恢复
当数据库关闭时,参数innodb_fast_shutDown影响着InnoDB的行为,参数值等级分为0,1,2。默认为1
0: Mysql关闭时,Innodb要完成所有的full purge和merge insert buffer
1: 不需要完成0时的操作,但是换冲池中的一些数据脏页还是会刷新回磁盘
2:将日志写入到日志文件,保证不会有任何的事务丢失,在下次启动数据库的时候进行恢复操作
数据库启动时,参数innodb_force_recovery影响整个InnoDB的恢复状态,默认等级为0,指进行所有的恢复操作
1:忽略检测到的corrupt页
2:阻止Master Thread线程的运行
3:不进行事务的回滚操作
4:不进行插入缓冲的合并操作
5:不查看撤销日志,Innodb会将未提交的事务都视为已提交
6:不进行前滚操作