谈谈InnoDB核心组件--Buffer Pool

前言

我们了解到buffer pool 是InnoDB独有的一个内存结构,之前初步了解到数据的增删改都是在这块内存里面执行。因为我们不可能直接在磁盘中对数据进行增删改,如果对磁盘的随机读写,速度会非常的慢,就更别谈每秒处理上千的请求了。之前也描述过虽然是在buffer pool是在内存中,但MySQL有非常严谨的兜底方法,就算宕机了,也可以配合 redo log 来进行数据的更新和刷盘。那buffer pool究竟长什么样子?

1. buffer pool 占用多少内存,多少合适?

buffer pool是一个内存数据结构,在MySQL内部肯定是占有一定的内存。

buffer pool的默认大小是128M,这个可以根据实际环境来进行分配。MySQL官网给出的建议是大小占用实际环境的80%,比如MySQL服务器是一个8核16G的机器,则可以分配12G内存。

innodb_buffer_pool_size = 12,884,901,888
图 1

2. buffer pool 存储的是什么样的数据?

大家都清楚数据库的核心数据模型是表+字段+行的概念,也就是说数据库有很多个表,表里面有很多的字段,每个字段都有对应的值,一行一行的数据构成了表。那有没有可能buffer pool储存的是一行一行的数据?

答案不是的。实际上MySQL对数据抽象出了一个数据页的概念,他把很多行数据放在了一个数据页里,也即是说磁盘文件里有很多的数据页,每一个数据页里放了很多行数据。

图 2

所以实际上,更新一行数据,数据库找到这行数据所在的数据页,然后从磁盘中把数据页加载到buffer pool中。也就是说,buffer pool存放的是一个一个的数据页。

图 2-2

3. 磁盘中的数据页与buffer pool中的缓存页如何对应起来?

默认情况下,一个数据页的大小为16kb,,包含了16kb的内容,而buffer pool中缓存页跟数据页是一一对应的,即是说buffer pool中缓存页的大小也为16kb。

图 3

而每个缓存页在buffer pool中都有对应的描述信息。描述信息也是一个数据块,相当于缓存页大小的5%,里面描述了该数据页所属的表空间、数据页的编号、这个缓存页在buffer pool中的地址等信息。每个描述信息放在buffer pool最前面,各个缓存页放在后面。

图 3-2

4. 初始化buffer pool

数据库在启动阶段是如何初始化buffer pool的呢?

当数据库启动的时候便会向操作系统申请一块内存给buffer pool,内存区域申请完毕后,就会按照默认的缓存页大小16kb和描述信息块的800左右的字节在buffer pool中划分出来一个一个的缓存页和他们所对应的描述数据块。

只不过这时的缓存页都是空的,等数据库完全运行起来,我们执行增删查改的时候,才会把对应的数据页加载到缓存页中。

5. 如何区分空闲缓存页--free链表

在不停的增删改查下,MySQL会不停的把数据页从磁盘中加载到缓存中里。随着16kb的数据页不停的加载,那是如何判断哪些缓存页是空闲的?

MySQL为buffer pool设计了free链表。在buffer pool中,每一个空闲的缓存页对应的描述数据块通过头节点和尾节点连接在一起,形成一个free链表。

每当数据页加载到buffer pool中,对应描述数据块就会记录相关的信息,找到相应的缓存页缓存数据页,然后从free链表中移除此描述数据块。

即如果缓存页是空闲的,他的描述数据块必定存在这个双向链表中。

图 5

除此之外,还会有一个基础节点,引用链表的头节点和尾节点,记录free链表的节点数,即空闲缓存页的个数。

free链表是由buffer pool的空闲描述数据块组成,并不会占用额外的内存空间,如果缓存页加载了数据,只会把节点从链表中移除。

6. 把磁盘的数据页加载到buffer pool的缓存页

有了free链表,这一步就很简单了。

首先从free链表中获取一个描述数据块,就可以获取到对应的空闲缓存页,写入描述信息,把磁盘上的数据页读取到缓存页,最后移除对应的描述数据块。

图 6

关于数据块如何从free链表中移除,可以参考以下伪代码:
假设节点02,上一个节点是01,下一个节点是03

DescriprionDataBlock() {
    block_id = 02;
    free_pre = 01;
    free_next = 03;
}

当03节点从free链表中移除,则把free_next 设置为null就可以了,03在free链表中就是去了引用关系。

DescriprionDataBlock() {
    block_id = 02;
    free_pre = 01;
    free_next = null;
}

7. 如何判断数据页有没有被缓存?

在执行增删查改的时候,首先肯定是判断数据页有没有被缓存,如果没有,则走上面的逻辑,从free链表中找一个空闲的缓存页,从磁盘读取数据页写入缓存页,写入描述信息,从free链表中移除此描述数据块。

如果数据页已经存在缓存里,那么就会直接使用。

所以MySQL还会有一个哈希表数据结构,用表空间号+数据页编号作为kye,缓存页地址作为value。

当需要数据页的时,就会用表空间号+数据页编号作为key去哈希表查,如果没有就读取数据页,如果有就说明数据页已经被缓存了。

也就是说,每将数据页读取到缓存页,都会在哈希表写入一个key-value。

图 7

8. 脏页--flush链表

在buffer pool的缓存页中,有查询出来的还没有更新的,有已经更新过数据的。更新过数据的缓存页肯定和磁盘上的不一致,这些缓存页便是脏数据,脏页。

这些脏页最终都是被随机刷入磁盘,但如何区分哪些缓存页是脏页?

数据库引入了跟free链表相似的flush链表,本质上flush链表也是有缓存页的描述数据块的两个指针组成的一个链表,只是这里是被修改过的缓存页的描述数据块。

但凡修改过的缓存页,都会把它相应的描述数据块加入到flush链表中,等待刷盘。

图 8
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 夜莺2517阅读 127,708评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,876评论 1 6
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,583评论 2 9