InnoDB学习(一)之BufferPool

我们知道InnoDB数据库的数据是持久化在磁盘上的,而磁盘的IO速度很慢,如果每次数据库访问都直接访问磁盘,显然严重影响数据库的性能。为了提升数据库的访问性能,InnoDB为数据库的数据增加了内存缓存区(BufferPool),避免每次访问数据库都进行磁盘IO。

缓存区BufferPool

缓存区并不是Innodb中特有的概念,操作系统中也有缓存区的概念,当用户第一次从磁盘读取文件时,会把文件缓存到内存中,后续再对这个文件进行读操作就可以直接从内存中读,从而减少磁盘IO次数。缓存只是内存中的一块连续空间,InnoDB是如何合理利用缓存区的空间的呢?本文会从以下几个方面介绍InnoDB的缓存区:

  1. 缓存区概览:InnoDB缓存区的结构和状态查询;
  2. 缓存区实例(BufferPool Instance):缓存区可以划分为多个实例;
  3. BufferChunk:缓存区实例内的数据块;
  4. 控制块和数据页:InnoDB是以什么形式缓存数据库中的数据的;
  5. 空闲空间管理;缓存区内的空闲空间管理逻辑;
  6. 用户数据管理:数据库数据和索引在缓存区缓存的管理;
  7. 自适应哈希索引:优化热点数据等值查询的哈希索引;
  8. ChangeBuffer简介:提高数据库更新效率的ChangeBuffer;
  9. 锁信息管理:InnoDB中的行锁信息也是存放在缓存区中的;

缓存区概览

InnoDB中的缓存区叫innodb_buffer_pool,当读取数据时,就会先从缓存中查看是否数据的页(page)存在,不存在的话去磁盘上检索,查到后缓存到innodb_buffer_pool中。同理,插入、修改、删除也是先操作缓存里数据,之后再以一定频率更新到磁盘上,这个刷盘机制叫做Checkpoint。

如下图所示,InnoDB中的数据主要有数据页、索引页、插入缓存、自适应哈希索引、锁信息和数据字典信息。我们经常听到的RedoLog不在缓存区中。

InnoDB缓存区结构

MySQL默认的innodb_buffer_pool的大小是128M,我们可以通过以下命令查看innodb_buffer_pool的参数,执行结果如下图所示:

show variables like 'innodb_buffer_pool%';

InnoDB缓存区参数示例

在MySQL使用过程中,我们可能需要查看缓存区的状态,比如已使用空间大小、脏页大小等状态,我们可以通过以下命令查看innodb_buffer_pool的状态,执行结果如下图所示,图中的执行结果中,共有8192页数据。

show global status like '%innodb_buffer_pool%';

InnoDB缓存区状态示例

缓存区实例

缓存区本身是一块内存空间,在多线程并发访问缓存的情况下,为了保证缓存页数据的正确性,可能会对缓存区单实例锁互斥访问,如果缓存区非常大并且多线程并发访问非常高的情况下,单实例缓存区的可能会影响请求的处理速度。如下图所示,数据库缓存区大小为3G,并发访问QPS为3000,如果缓存区只有一个实例,那么这3000个请求可能需要竞争同一个互斥锁。

InnoDB缓存区单个实例

MySQL 5.5引入了缓存区实例作为减小内部锁争用来提高MySQL吞吐量的手段,用户可以通过设置innodb_buffer_pool_instances参数来指定InnoDB缓存区实例的数目,默认缓存区实例的数目为1。缓存区实例的大小均为`innodb_buffer_pool_size/innodb_buffer_pool_instances。如下图所示,数据库缓存区大小为3G,并发访问QPS为3000,如果缓存区有3个实例,理想情况下最多每1000个请求会竞争同一个互斥锁。

InnoDB缓存区多个实例

如果缓存区总空间大小小于1G,innodb_buffer_pool_instances会被重置为1,因为小空间的多个缓存区实例反而会影响查询性能。

缓存区实例有以下特点:

  1. 缓存区实例有自己的锁/信号量/物理块/逻辑链表,缓存区实例之间没有锁竞争关系;
  2. 所有缓存区实例的空间在数据库启动时分配,数据库关闭后释放;
  3. 缓存页按照哈希函数随机分布到不同的
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-御狐神-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值