三、MySQL整体概述 之缓冲池(Buffer Pool)

MySQL整体概述 之缓冲池(Buffer Pool)

文章非原创,属于对以往学习到的知识的归纳总结,文中可能存在大段截取其他文章的片段,博客属于自我学习的笔记总结会持续更新。。。

一、缓冲池
我们知道数据库数据最终是存到磁盘上的,但是我们操作数据的时候如果直接操作磁盘进行随机的读写操作,速度会很慢,最终拖慢你处理请求的能力。因此我们的增删改操作主要针对内存数据执行。

二、缓冲池结构
在这里插入图片描述
1.设置缓冲池的大小
缓冲池默认的大小为128M,在实际的生产环境中一般建议设计为机器内容空间的60%,假如在16核32G的机器下我们可以给他分配2G的内存,那么我们如下配置即可。

[server]
innodb_buffer_pool_size = 2147483648

2.数据页
是mysql抽象出来的数据概念,MySQL把许多行数据放在数据页里。磁盘中的数据页默认大小为16KB,缓冲池中的数据页我们称之为缓冲页,它默认跟数据页是一一对应的关系因此也是16KB,但是缓冲页存在一个描述数据(元数据),里面包含:这个缓冲页所属的表空间,数据页编号,在缓冲池中的地址等。这些描述数据大概数据页大小的5%800个字节左右,所以缓冲池的实际大小是大于128M的大概在130M 左右。缓冲池大小为128M数据页大小为16kb描述数据大小为800个字节,在分配空间存放缓存页的时候肯定存在一些内存碎片。
注意:在SQL语句中我们只关心表、列、行这些都是逻辑概念,但表中数据库磁盘中就是按照数据页来存放的 这个就是物理概念了。
3.数据页的加载
缓冲池初始分配好空间之后,内部的缓冲页都是空。数据库运行,开始进行增删查改操作,需要先将磁盘上的数据页加载进缓冲池中,那它怎么知道应该加载到哪个缓存页中呢?(肯定是需要加载到空白缓存页中,但是加载的时候它怎么知道哪个缓存页是空的呢?)在数据库会为Buffer Pool设计一个free链表,该链表并不是额外重新分配出来一个空间单独维护一个表,而是将空白的缓存页对应的描述数据(元数据)相关联形成一个双向链表,所以在这个链表中每个节点就是一个缓冲页的描述数据的地址,因此只要一个缓存页是空闲的,那么他的描述数据块就会被放入这个free链表中。(但是在free链表中还有一个基础节点大约是40个字节左右是不属于Buffer Pool的,它里面存放的是一个开始节点的地址,一个结束节点的地址,以及表中存放的节点的个数。)
有了free链表 从表里获取一个描述数据块,然后就可以对应的获取到这个描述数据块对应的空闲缓存页,接着我们就可以把磁盘上的数据页读取到对应的缓存页里去,同时把相关的一些描述数据写入缓存页的描述数据块里去,比如 这个数据页所属的表空间之类的信息,最后把那个描述数据块从fr

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值