MYSQL----InnoDB的Buffer Pool

什么是Buffer Pool??

 顾名思义,缓冲池。

默认情况下,Buffer Pool大小为128MB,或者可以配置文件中配置innodb_buffer_pool_size启动选项:

[server]
innodb_buffer_pool_size = 536870912

innodb_buffer_pool_size单位为字节,上面示例指定了Buffer Pool的大小为512MB

注意:innodb_buffer_pool_size最小为5MB,即5242880

为什么需要Buffer Pool?

相信大家都了解,对于使用InnoDB存储引擎的表,不论是数据还是索引等等都是以页的形式存放在表中。表空间即一个或多个实际文件的抽象,说到底我们的数据还是在磁盘上。

磁盘的速度不用多说,媲美乌龟。

于是InnoDB设计者在MYSQL启动时向操作系统申请了一块连续的内存----Buffer Pool。当需要访问某个页的数据时,把完整页的数据全部加载到内存中,就可以进行读写访问了,而且在读写访问之后不急着释放,而是缓存起来,将来再次访问时,能够省下磁盘I/O开销。
申请的连续的内存由控制块和缓冲页组成,每个控制块和缓冲页一一对应。

BufferPool链表管理

InnoDB使用了许多链表来管理Buffer Pool

  • free链表
            每一个节点都代表一个空闲的缓冲页,当从磁盘中的页加载到BufferPool中时,会从free链表中寻找空闲的缓冲页。
  • flush链表
            在BufferPool中,被修改的页称为脏页,脏页并不是立即刷新的,而是加入到flush链表中,之后再刷新到磁盘。
  • LRU链表
            分为young和old区域,可以调节占比。首次从磁盘加载到BufferPool中的页会被放到old的头部,在innodb_old_blocks_time间隔时间内访问该页时,不会把它移动到young区域头部。在BufferPool中没有可用的空闲缓冲页时,会首先淘汰掉old区域中的一些页。

PS: 

  • 可以通过指定innodb_buffer_pool_instances来控制BufferPool的实力个数。
  • 每个BufferPool实例都有各自独立的链表,互不干扰。
  • BufferPool实例由若干个chunk组成,chunk大小可以在服务器启动时通过启动选项调整。
  • MYSQL5.7.5版本之后,可以在服务器运行过程中调节bufferPool大小。
  • 查看BufferPool的状态信息: SHOW ENGINE INNODB STATUS \G
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>