什么是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