插入缓冲
俩次写
自适应哈希索引
异步IO
刷新邻接页
插入缓冲Insert Buffer:物理页的一部分
对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引数据页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入,若不在,先放在一个Insert Buffer对象中,看似数据库已经将这个非聚集索引插入到叶子节点中,实则没有,只是存放在另一个位置,再以一定的频率和情况进行Insert Buffer和辅助索引数据页的子节点的merge操作,将多个插入合并到一个操作中(在一个索引数据页中)来提高对于非聚集索引插入的性能。
Insert Buffer插入条件:
索引是辅助索引
索引不是唯一的
show engine innodb status;查看插入缓冲信息
IBUF_POOL_SIZE_PER_MAX_SIZE:控制插入缓冲的大小(因为写密集的情况下,Insert Buufer会占用过多的缓冲池内存,默认最大可占1/2,将次参数改为3,则最大占1/3)
Change Buffer(Insert Buffer 升级)
对DML(Insert,Delete,Update)操作都可进行缓冲,分别为:Insert Buffer,Delete Buffer,Purge Buffer(都只适应非唯一辅助索引)
innodb_change_buffering(控制插入缓冲是否开启):inserts(insert 操作),deletes(delete 操作),purges(update 操作),changes(启用inserts和deletes),all(都启用),none(都不启用)
innodb_change_buffer_size(控制Change Buffer最大内存使用量):默认25,最多使用1/4的缓冲内存空间
Innsert Buffer内部实现:
数据库全局有一个Insert Buffer B+树(之前版本是每个表一颗)。
(涉及较多的索引知识,回头再看)
俩次写(doublewrite):
部分写失效(partial page write):InnoDb正在写入某个页到表中,写了一部分,发生宕机
(可以通过重做日志进行恢复,但重做日志是对数据页的操作,如果数据页本身已经损坏,则不行)
所以在应用重做日志前,需要一个页的副本,当写入失效发生时,先通过页的副本还原页,在进行重做,就是doublewrite
doublewrite分为俩部分:
一部分是内存中的doublewrite buffer(2MB)
另一部分是物理磁盘上共享表空间中的连续128个页(2MB)
对脏页刷新时,并不是直接写磁盘,而是先通过memcpy函数将脏页复制到内存中的doblewrite buffer,之后通过doublewrite buffer再分俩次,每次1MB顺序地写入共享表空间的物理磁盘上,然后调用fsync函数,同步磁盘,避免缓冲写带来的问题(此时doublewrite是顺序的)。完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中,此时的写时离散的。
参数skip_innodb_doublewrite可禁止使用doublewrite功能
自适应哈希索引
Innodb会监控对表上的各索引页的查询,观察到建立哈希索引可以带来速度提升,则建立哈希索引,称为自适应索引(Adaptive Hash index , AHI)。AHI是通过缓冲池的B+树页构造而来,因此建立速度快,不需要对整张表建立哈希索引。Innodb会自动根据访问的频率和模式来自动为某些热点页建立哈希索引。
要求:
对这个页的访问模式(查询条件)必须是一样的。
以该访问模式访问了100次
页通过该模式访问了N次,其中N=页中记录*1/16
异步IO(Asynchronous IO,AIO):
可以进行IO Merge操作,就是将多次IO操作合并成一次