mysql的buffer pool

引入

  • 比如,数据A中有个B表,B表中有一条数据的phone为1XXX,需要对这个手机号频繁的修改,那么这个过程会频繁涉及到内存和磁盘的交互,因为磁盘的读取太慢,为了提升性能,就可以在内存和磁盘之间添加一个缓存,把原本的内存和磁盘的交互,转变成让缓存和磁盘做后续的操作,以达到提升效率的效果。

对于数据如何和磁盘交互,什么时候同步到磁盘需要注意下,

  • 因为缓存一般是基于内存的,对于内存而言一旦宕机,内存中的数据就没有了,需要注意如何把脏页数据同步到磁盘,对于这个同步的过程可以称为‘刷脏’。
  • 在mysql中,后台会有几个现场,在某些固定时间间隔/缓存满了/某个日志满了时进行一次刷脏。
  • 脏页:没有来得及同步到磁盘的数据。
  • 刷脏:将没有来得及同步到磁盘的数据同步到磁盘的过程。
    简单举例
    在这里插入图片描述

buffer pool

对于mysql来说,数据是存储在磁盘上的,除了MEMORY引擎,因为如果每次查询/修改都直接和磁盘交互的话,性能是很差的,为了提升读写性能,Innodb引入了中间层buffer pool

作用

buffer pool的作用:缓存表数据和索引数据,把磁盘上的数据加载到缓冲池,避免每次都进行磁盘IO,从而提升访问速度,也可以认为是缓存页数据的,对于每个页数据大小为16KB。

  • 页数据:页innodb的存储单元,采用了一种预读思想,无论是在磁盘、还是buffer pool中,都是按页进行读取的。

在这里插入图片描述

有了buffer pool之后的查询

  1. 会先检查buffer pool是否存在该数据
  2. 如果存在,直接从buffer pool中获取,避免频繁磁盘读取,从而提升性能;如果不存在再去从磁盘去读取,取到之后,会把数据所在的页复制一份到buffer pool,并返回给客户端。
  3. 后续,再次读取可以从buffer pool中就近读取。

对于修改操作类似。

buffer pool 配置

  • 因为buffer pool是基于内存的,那么对应的空间是不可能无限大的。

windows版本默认大小为8M
linux版本默认大小为128M

  • 可以通过修改配置文件中的innodb_buffer_pool_size参数来修改buffer pool的整个大小
-- 查看buffer pool
show variables like 'innodb_buffer_pool_size';

-- 修改buffer pool
set global innodb_buffer_pool_size=16M

在这里插入图片描述

注意:对于buffer pool的大小来说,如果有台4c8g的服务器用于数据库使用,那么在很多情况下,为了优化性能,会将整个buffer pool的大小设置占比为整个服务的60%-80%。

buffer pool满了怎么处理

  • 可以认为是内存满了,如果内存满了,会怎么处理?当然是触发内存淘汰策略,对于buffer pool而言同样如此,使用特殊的LRU(最近最少使用)内存淘汰策略。

对于内存淘汰策略,我将会更新在下一个文章

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值