mysql原理三:mysql引擎InnoDB内存和磁盘架构

mysql的InnoDB引擎的内存和磁盘架构如下图所示: 

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第1张图片

内存区域中,有缓存池Buffer Pool,其结构如下图所示:

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第2张图片

 free链表为空闲链表,保存了buffer pool中的空闲的内存空间,一个控制块对应于一个空白块,大小为一个也的大小,默认为16kb。

当执行一个update语句后,会先更新buffer pool中的数据页,而该页变为脏页,如下图:

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第3张图片

 对于脏页,有一个flush链表控制:

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第4张图片

 当buffer pool空间满时,需要淘汰内存块,以放入新数据页,而实现淘汰策略,有个一lru链表:

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第5张图片

 lru链表中数据块,最近越使用的越靠前,淘汰时从链表末尾进行淘汰。

考虑如下sql:
 

select * from t1;

这是一个全表扫描sql,那么扫描到的数据会放到buffer pool,如果数据量很大,会把buffer pool中的数据全部淘汰掉,这样就会有一个问题,把访问很频繁的数据淘汰掉。为了解决这个问题,lru链表实际上是这样的:

mysql原理三:mysql引擎InnoDB内存和磁盘架构_第6张图片

lru链表分两部分:热数据区(占5/8)和冷数据区(占3/8),这里的热数据和冷数据和常规理解的不太一样:冷数据第一次被访问的时间为t1,第二次被访问的时间为t2,t2-t1>1秒钟,则把该数据从冷数据区移到热数据。注意: 这里是t2-t1>1秒,而不是t2-t1<1秒,这么做是为了解决上边那种全表扫描把buffer pool中有价值的数据淘汰掉的问题。当全表扫描时,数据是顺序访问的,一条接一条,那么同一页被先后访问到的时间间隔就很小,不会超过1秒,因此根据t2-t1>1秒才把冷数据移到热数据的规则,全表扫描时,不会把buffer pool中有价值的数据替换掉。

 

你可能感兴趣的:(数据库,mysql,innodb)