Innodb Buffer Pool内部结构

Innodb Buffer Pool内部结构

1.    Innodb Buffer 功能

Innodb buffer pool的主要功能存储外存页面在内存中的镜像.镜像有如下2种镜像:

(1)只读镜像:只读镜像读取的是非脏页。

(2)更新镜像:更新镜像为buffer pool中的脏页。

Innodb实现了行级多版本(MVCC),而不是整个页的多版本。Oracle在实现中存在第三种镜像,就是版本镜像。而innodb中确实没有。在innodb中任何外存中的脏页的读取以及更新都是在buffer pool中进行。

2 .Innodb Pool数据结构

在innodb buffer pool整个模块设计的时候,使用了如下主要的数据结构:

(1)buf_page_t:外存页在内存中的存储结构,包括压缩页和非压缩页。

(2)buf_block_t:在innodb buffer pool存在页的页控制结构,该结构控制页包含的互斥量等内存结构保护的对象。每一个结构都包含buf_page_t的成员。内存中的每一个页都有一个对应的buf_block_t的结构。在innodb在指定innodb_buffer_pool_size启动时候,会预先按照该参数指定的值计算当前内存池可以存储多少个页以及每个页需要的buf_block_t的数量,来对该结构分配内存。MySQL 中每个连接线程想要访问内存池中的页必须获取对应页的buf_block_t的mutex。

(3)buf_chunk_t:该结构主要包含了buf_block_t的一个数组。

(4)buf_pool_t:innodb buffer pool的结构,该结构包含了压缩页和非压缩页的哈希表维护、buf_chunk_t的维护、以及3种链表。分别为free list、flush LRU list、LRU list。同时innodb buffer pool还维护一个哈希表,该哈希表存在于内存中,目前buffer pool中存在的页的哈希表。每个innod buffer pool都有一个mutex来保护该内存结构。

3.    页的映射

Innodb buffer pool中每一个页会按照内部规则,依据每个页的space_id以及offset进行函数运算把外存中的页加载到内存池中。每个连接线程访问某个页时候会依据页的space id以及offset进行函数运算,该函数返回去某个buffer pool 的指针,最后在指定的(函数运算后得到的某个buffer pool) buffer pool中进行查找,如果找到了就直接访问;如果没有找到就依据页的space id以及offset进行函数运算出需要加载到哪个buffer pool中,最后通过IO操作把页加载到指定的buffer pool中。例如目前innodb buffer pool分配了20G内存,而innodb buffer pool的数量是8个,如果访问一个页不再内存池中,则从外存中加载页到这个8个内存池中的一个。如果存在于内存池中,则只需要查找一个内存池中的哈希表是否有该页的存在。这样能提高搜索的效率。

以上提到依据space id以及offsset获取某个buffer pool实例的函数是buf_pool_get,返回值为buf_pool_t。如下是该函数的原型:

/******************************************************************//**

Returns the buffer pool instance given space and offset of page

@return buffer pool */

UNIV_INLINE

buf_pool_t*

buf_pool_get(

/*==========*/

ulint  space, /*!< in: space id */

ulint  offset)    /*!< in: offset of the page within space */

4.    内存池的转储/恢复

MySQL在新版本以后新增buffer pool的转储以及恢复。它的主要应用场景在MySQL服务器需要重启,但是又不影响之前高峰期的时候的热点数据。

Innodb buffer pool的转储是把内存中的每个页的space id以及offset的组合转储到外存中,而不是把整个内存中所有的内容都转储出来。Buffer pool的转储需要经历如下步骤:

  1. 获取buffer pool的mutex。
  2. 遍历pool中的LRU list,读取其中page的space id以及offset,存入到内存数组中。
  3. 释放buffer pool中的mutex。
  4. 将数组中的内容写入到磁盘文件。
时间: 2024-10-23 23:48:45

Innodb Buffer Pool内部结构的相关文章

MYSQL的InnoDB Buffer Pool内部机制

1. 基本结构:INNODB用least recently used (LRU) 算法来管理他的buffer_pool. buffer_pool在内部被分隔为两个list. a young list 和 a old list. Young list 存储那些高频使用的缓存数据(默认占整个BUFFER的5/8) Old list 存储那些低频使用的数据(默认占整个BUFFER的3/8) 2.使用机制:当一个新块数据被从磁盘缓存到buffer当中,它默认被放在Old list的头部,即midpoin

innodb buffer pool小解

INNODB维护了一个缓存数据和索引信息到内存的存储区叫做buffer pool,他会将最近访问的数据缓存到缓冲区.通过配置各个buffer pool的参数,我们可以显著提高MySQL的性能. INNODB的buffer pool是基于LRU算法来实现的,我们可以简单了解以下LRU算法: LRU: least recently used ,INNODB管理buffer poll是将buffer pool作为一个list管理,基于LRU算法的管理.当有新的页信息要读入到buffer pool里面的

mysql_存储引擎层-innodb buffer pool

buffer pool 是innodb存储引擎带的一个缓存池,查询数据时,首先从内存中查询 数据如果内存中存在的话直接返回. innodb buffer pool 和 qcache 的区别:Qcache 缓存的是sql语句对应的结果集, buffer pool中缓存的是表中的数据(热).buffer pool是设置的越大越好,一般设置为 物理服务器内存的70% 参数: innodb_buffer_pool_size innodb_buffer_pool的大小 innodb_buffer_pool

innodb buffer pool相关特性

背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer poll 需要一段时间预热,期间数据库的性能会受到明显影响.另外mysql 5.7以前innodb buffer pool缓存大小修改不是动态的,重启才能生效.因此innodb buffer pool的预热和innodb buffer pool大小的动态修改,对性能要求较高的应用来说是不错的特性,下面我

MySQL &#183; 性能优化&#183; InnoDB buffer pool flush策略漫谈

MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool instance的个数,不过在5.7版本中开始默认以128M(可配置)的chunk单位分配内存块,这样做的目的是为了支持buffer pool的在线动态调整大小. Buffer pool的每个内存块通过mmap的方式分配内

InnoDB buffer pool 刷新快慢取决因素

innodb buffer pool 刷新快慢取决于两个参数 mysql> show variables like 'innodb_io_capacity%';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| innodb_io_capacity | 200 || innodb_io_capacity_max | 2000 |+---------------

020:InnoDB Buffer Pool

一. 缓冲池(Buffer Pool) 1. 缓冲池介绍 每次读写数据都是通过 Buffer Pool : 当Buffer Pool 中没有用户所需要的数据时,才去硬盘中获取: 通过 innodb_buffer_pool_size进行设置总容量,该值设置的越大越好: innodb_buffer_pool_instances 设置为多个缓冲池: 总容量还是innodb_buffer_pool_size 设置多个instance 可将热点打散,提高并发性能(建议设置成CPU个数值) Buffer P

在线调整InnoDB Buffer Pool Size

InnoDB Buffer Pool主要是用来缓存数据表和索引数据的内存区域,它的默认值为134217728字节(128MB).最大值取决于CPU架构;32位系统上的最大值为4294967295(232-1),64位系统上的最大值为18446744073709551615(264-1).在32位系统上,CPU体系结构和操作系统的实际最大大小可能低于标准的最大大小.当缓冲池的大小大于1GB时,将innodb_buffer_pool_instances设置为大于1的值可以提高繁忙服务器上的可伸缩性.

innodb buffer pool

InnoDB Plugin特性介绍:让Buffer Pool不被污染 较之MyISAM的一个很大的优势是,InnoDB会缓存数据块.如果系统中的数据量并不大,或者或者活跃数据量并不大时,InnoDB会将这些数据块全部缓存到Buffer Pool(内存)中,这样可以最大限度的提高提供的响应速度,特别是读取.当用户请求需要查询数据块时,InnoDB会首先在Buffer Pool中查找数据,如果Buffer Pool中没有该数据块时,InnoDB会从磁盘上Load对应的数据块,并通过LRU算法替代当前