加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 评论 > 正文

MySQL的Buffer Pool

发布时间:2021-04-06 10:27:30 所属栏目:评论 来源:互联网
导读:查询语句为例 1:在查询的时候会先去buffer pool(内存)中看看有没有对应的数据页,如果有的话直接返回 2:如果buffer pool中没有对应的数据页,则会去磁盘中查找,磁盘中如果找到了对应的数据,则会把该页的数据直接copy一份到buffer pool中返回给客户端 3:下

查询语句为例 1:在查询的时候会先去buffer pool(内存)中看看有没有对应的数据页,如果有的话直接返回 2:如果buffer pool中没有对应的数据页,则会去磁盘中查找,磁盘中如果找到了对应的数据,则会把该页的数据直接copy一份到buffer pool中返回给客户端 3:下次有同样的查询进来直接查找buffer pool找到对应的数据返回即可。

大家看到这里相信应该对buffer pool有了个大概的认识,有没有感觉有点缓存的感觉,当然buffer pool可没有缓存那么简单,内部结构还是比较复杂的,不过没关系,咱们继续往下看。

buffer pool数据管理

数据管理的基本单位

buffer pool毕竟是一种内存管理,数据当然不是按照一条一条的sql语句来管理的,而是按照数据页来管理的,innodb 引擎默认的数据页是16kb,而buffer pool启动的时候是默认的128M,所以是有8192个数据页的。而磁盘的数据管理也是用数据页为单位来管理的,所以每次查找数据的时候,先请求buffer pool,buffer pool中没有的话会到磁盘中找到对应的数据页,然后copy到buffer pool中给客户端返回。

free链表

正常情况下,buffer pool肯定是从第一个数据页,不断的往后填充的,一个一个的往后写入,每次直接在后面追加就可以了。如下图(黄色部分表示已经写入数据)可以看一看free链表的结构

  • free链表有一个基节点,记录了该free链表的唯一标志,该链表的尾节点地址,以及链表的总长度
  • 基节点后面会有很多的控制块,控制块本身很小,只是存储了指向空闲数据页的指针而已,所以buffer pool在寻找空闲数据页的时候直接用free链表可以直接找到。
  • 只要有一页数据空闲出来之后,直接把该数据页的地址追加到free链表即可。

flush链表

当然只是用free链表是解决不了所有问题的,比如:我们在执行update table test set field_a = 1;的时候,我们是先修改buffer pool里面对应的数据页,然后再更新磁盘中对应的数据页的,(当然这里会涉及到一个数据一致性的问题,mysql是用redo log解决的,这个不在咱们这篇文章的讨论范围之内)我们把buffer pool中对应修改的数据页同步修改到磁盘的时候,这个过程称之为"刷脏",刷脏是有一定策略的,可以用

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读