天天看点

IT技术栈-Innodb存储引擎体系架构详解之内存结构

作者:IT届的感情青年
IT技术栈-Innodb存储引擎体系架构详解之内存结构

Innodb内存结构

内存结构主要包括Buffer Pool,Change Buffer,Adaptive Hash Index和Log buffer四大组件。

  • Buffer Pool:缓冲池,简称BP。BP以页为单位,默认大小16kb。底层以链表数据结构管理页。Innodb在访问数据表和索引时会在BP中缓存,以后使用可以减少磁盘IO操作,提升效率。

page管理机制

#page根据状态可以分为三种类型:
		free page:空闲page,未被使用
		clean page:被使用,但未被修改的数据页
		dirty page:脏页,被使用,但被修改的数据页,页中的数据和磁盘中的数据不一致           
#针对上述三种page类型,Innod提供三种链表数据结构来维护和管理
		free list:表示空闲缓冲区,管理free page
		flush list:表示需要刷新到磁盘的缓冲区,用于管理dirty page。内部按修改时间排序。(dirty page即
即保存在flush list,有保存在lru list.但是二者侧重点不同,flush list负责管理脏页的刷盘操作,lru 
list 负责管理page的可用性和释放)
		lru list:表示正在被使用的缓冲区,管理clean page和dirty page,缓冲区以midpoint未几点,前面
部分称为new列表区,管理经常被使用的page,占67%;后面部分称为old列表区,存放使用较少的
page,占33%。           
#改进型lru算法
		普通lru算法:末尾淘汰法,新数据加入时从头部插入,释放空间时从末尾淘汰
    改进型lru算法:链表分为new和old两部分,加入数据时,并不是从头部插入,而是从链表的中间
插入,如果数据很快被访问,那么page就会项new的表头移动,如果数据没有被访问,page就会逐步
向old链表尾部移动。
		每当有新的数据被读取到BP中时,就会判断是否有空闲页,如果有就从free list中删除,添加到lru 
 list中。如果没有,就会根据lru算法,将lru中的page释放交给新的数据。           
#配置参数
		①innodb_buffer_pool_size		
    ②innode_buffer_pool_instance
    ③innodb_buffer_pool_chunk_size
    ④innodb_old_block_pct
    ⑤innodb_new_block_pct
    ① =  ②  *  ③
		innodb_buffer_pool_size可以设置为总内存的60%-80%,innodb_buffer_pool_instance可以设置
为多个,避免缓存争用           
  • Change Buffer:写缓存数据区,简称CB。进行DML操作时,当BP中没有相应的数据时,innodb并不进行磁盘操作将数据读取到缓冲区,而是在CB中记录数据变更,等未来读取数据时再进行合并将数据恢复到BP中

CB占用BP的内存空间,默认占25%,最大占50%,可以根据读写业务适当调整

Change Buffer仅适用非唯一普通索引页,为什么? 答:如果索引设置唯一性,进行修改时,innodb必须进行一次唯一性校验,因此必须查询磁盘,做一次IO操作,将数据加载到Buffer Pool中,在Buffer Pool中进行修改,不会在Change Buffer进行修改

当更新一条记录时,如果该数据在Buffer Pool中存在,直接在Buffer Pool中修改,做一次内存操作;如果该数据,在Buffer Pool中不存在(没有命中),会直接在CB中做一次内存操作,不用去查询磁盘,避免一次磁盘IO,当下次查询时,会先从磁盘中查询数据,再从CB查询相应的数据合并,再载入到BP中。

  • Adaptive Hash Index:自适应Hash,用于优化对BP数据的查询,Innodb会监控对表数据的查找,如果观察到建立哈希索引可以带来速度的提升,会建立哈希索引,所以称之为自适应。Innodb会根据访问的频率和模式来为某些页建立哈希索引。
  • Log Buffer:日志缓冲文件,用来保存将要写入磁盘log文件(redo|undo)中的数据,Log Buffer文件中的数据定期刷星到磁盘log文件中,日志缓冲区满时,会自动刷新到磁盘IO,当遇到BLOB数据或多行更新的大事务操作时,适当增加Log Buffer可以减少磁盘IO。
#innodb_flush_log_at_trx_commit控制Log Buffer刷新策略:
0: 每隔1秒写日志文件和刷盘操作(写日志:Log_Buffer --> OS Cache,刷盘:OS Cache --> c磁盘)
1: 事务提交写日志文件和刷盘,数据不丢失,但是频繁IO操作
2: 事务提交,写日志文件,每隔1秒后刷盘操作。           

继续阅读