mysql(五) buffer pool(缓存页数据与索引数据)

7 篇文章 0 订阅
6 篇文章 0 订阅

前面写了很多mysql的实用基础知识、接下来我将总结整理一些进阶和更深的一些知识、你知道的越多、不知道就越多、让我们一起学习。

目录

一、buffer pool的位置(Innodb存储引擎内)

二、Buffer Pool是什么?

1、降低磁盘访问的机制

2、Buffer Pool的大小

三、buffer pool的内部缓存了什么

四、Buffer Pool控制块

1、控制块是什么

2、控制块的大小

3、碎片是什么

4、缓存池的预读

五、Buffer Pool页分类和管理

1、页分类(Free Page(空闲页)、Clean Page(干净页)、Dirty Page(脏页))

Free Page(空闲页):

Clean Page(干净页):

Dirty Page(脏页):

2、Buffer Pool管理(LRU链表,free链表,flush链表)


前面4篇、我们从简单的sql语句优化到索引基础、再到索引使用和规则学习和复习一遍。

接下来我们要更深一步的思考、我们原来图上只写了一句查询索引、哪么就有下面这样的问题

1、索引是文件、每次查询都是去文件进行查询吗?(我们都知道IO操作非常消耗性能)

正常情况下查询数据,我们都是先从缓存查,查不到再从数据库查,同样的数据库也不想一直读磁盘,就需要优化、也加个缓存也就是buffer pool了、把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。

带着问题去学习和复习、保证有效性和记忆性。

先画图

一、buffer pool的位置(Innodb存储引擎内)

我们先看图再引入概念:缓冲池(buffer pool)是Innodb存储引擎内的

二、Buffer Pool是什么?

1、降低磁盘访问的机制

缓冲池(buffer pool)是Innodb存储引擎内一种降低磁盘访问的机制、通常以页(page)为单位缓存数据。缓存最热的数据页(data page)与索引页(index page),Page页默认大小16K,BP的底层采用链表数据结构管理Page。

2、Buffer Pool的大小

Buffer Pool 是在 MySQL 启动的时候,向操作系统申请的一片连续的内存空间,默认配置下 Buffer Pool 只有 128MB 。

可以通过调整 innodb_buffer_pool_size 参数来设置 Buffer Pool 的大小,一般建议设置成可用物理内存的 60%~80%。

三、buffer pool的内部缓存了什么

Buffer Pool 除了缓存「索引页」和「数据页」,还包括了 锁信息,插入缓存、自适应哈希索引、undo 页等等数据

在 MySQL 启动的时候,InnoDB 会为 Buffer Pool 申请一片连续的内存空间,然后按照默认的16KB的大小划分出页, Buffer Pool 中的页就叫做缓存页。这些缓存页开始都是空闲页,随着程序的运行,才会有磁盘上的页被缓存到 Buffer Pool 中。

四、Buffer Pool控制块

1、控制块是什么

Buffer Pool中缓存的是数据页,数据页大小跟磁盘默认数据页大小一样(16K),为了更好管理的缓存页产生了一个控制块(描述数据的区域)。

InnoDB 为每一个缓存的数据页都创建了一个单独的区域,记录的数据页的元数据信息,包括数据页所属表空间、数据页编号、缓存页在Buffer Pool中的地址,链表节点信息、一些锁信息以及 LSN 信息等,这个区域被称之为控制块

2、控制块的大小

控制块大概占缓存页大小的5%,16 * 1024 * 0.05 = 819个字节左右

3、碎片是什么

        数据页大小为16KB、而控制块的大小819个字节左右、分好所有的控制块数据页后,可能会有剩余的空间不够一对控制块和缓存页的大小、这个剩余的空间就叫碎片空间。

优化:把Buffer Pool 的大小计算后设置的刚刚好的话,也可能不会产生碎片。

4、缓存池的预读

问:比如我们需要查询一条记录,那么缓冲池就会缓存这一条记录吗?

不知道大家是否还记得局部性原理

局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

答:整页数据、缓冲池提升IO效率,读取数据时候存在一个局限性原理,即使用一些数据,大概率还会使用它周围的一些数据,因此采用预读机制提前加载,减少未来可能的磁盘IO操作。将页加载到 Buffer Pool 后,再通过页里的页目录去定位到某条具体的记录。

五、Buffer Pool页分类和管理

1、页分类(Free Page(空闲页)、Clean Page(干净页)、Dirty Page(脏页))

Free Page(空闲页)

在Buffer pool刚初始化时分割空间、生成的一个一个页、此时里面的数据页以及控制块都是空的就是空闲页,位于 Free 链表。

Clean Page(干净页)

表示此页已被使用,但是页面未发生修改,位于LRU 链表。

Dirty Page(脏页):

是缓存的数据发生修改、变更数据和磁盘上的数据不一致所以是脏缓存页 脏缓存页的数据是要刷到磁盘上的。 当脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页。脏页同时存在于 LRU 链表和 Flush 链表

2、Buffer Pool管理(LRU链表,free链表,flush链表)

上面说了三个页的类型、InnoDB也正是通过这三个链表的使用来控制数据页的更新与淘汰的。

我们在下一篇具体写三个链表是如何实现数据页的更新与淘汰。

版权声明:转载请附上文章地址DJyzh的博客_CSDN博客-java基础,框架,java高级领域博主

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值