第一节 概述

缓冲池 VS 查询缓存:缓冲池和查询缓存是一个东西吗? 不是!
InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作)。而磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请占用内存来作为数据缓冲池,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问。
这样做的好处是可以让磁盘活动最小化,从而减少与磁盘直接进行 I/O 的时间。要知道,这种策略对提升 SQL 语句的查询性能来说至关重要。如果索引的数据在缓冲池里,那么访问的成本就会降低很多。

第二节 数据库缓冲池

2.1 缓冲池

首先我们需要了解在 InnoDB 存储引擎中,缓冲池都包括了哪些。在 InnoDB 存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存的大部分,它用来存储各种数据的缓存,如下图所示:

从图中,你能看到 InnoDB 缓冲池包括了数据页、索引页、插入缓冲、锁信息、自适应 Hash 和数据字典信息等。
缓存原则:
“ 位置 * 频次 ”这个原则,可以帮我们对 I/O 访问效率进行优化。首先,位置决定效率,提供缓冲池就是为了在内存中可以直接访问数据。其次,频次决定优先级顺序。因为缓冲池的大小是有限的,比如磁盘有 200G,但是内存只有 16G,缓冲池大小只有 1G,就无法将所有数据都加载到缓冲池里,这时就涉及到优先级顺序,会 优先对使用频次高的热数据进行加载 。
如何做到缓冲池里的都是热点数据?

  1. Redis是如何做到内存中都是热点数据?
    “定期删除+惰性删除 ”和“内存淘汰机制(volatile-lru: 在设置了超时时间(expire )的key中优先删除最近最少使用(less recently used ,LRU) 的 key。)”
  2. mysql缓冲池是如何做的?
    缓冲池是基于传统的LRU方法来进行缓存页管理的,我们先来看下如果使用LRU是如何管理的。LRU,全称是Least Recently Used,中文名字叫作「最近最少使用」。从名字上就很容易理解了。
    这里分两种情况:
    (1) 缓存页已在缓冲池中
    这种情况下会将对应的缓存页放到LRU链表的头部,无需从磁盘再进行读取,也无需淘汰其它缓存页。如下图所示,如果要访问的数据在6号页中,则将6号页放到链表头部即可,这种情况下没有缓存页被淘汰。

    (2) 缓存页不在缓冲池中
    缓存页不在缓冲中,这时候就需要从磁盘中读入对应的数据页,将其放置在链表头部,同时淘汰掉末尾的缓存页。如下图所示,如果要访问的数据在60号页中,60号页不在缓冲池中,此时加载进来放到链表的头部,同时淘汰掉末尾的17号缓存页。

缓存池污染
还有一种情况是当执行一条SQL语句时,如果扫描了大量数据或是进行了全表扫描,此时缓冲池中就会加载大量的数据页,从而将缓冲池中已存在的所有页替换出去,这种情况同样是不合理的。这就是缓冲池污染,并且还会导致MySQL性能急剧下降。

冷热数据分离
这样看来,传统的LRU方法并不能满足缓冲池的空间管理。因此,Msyql基于LRU设计了冷热数据分离的处理方案。也就是将LRU链表分为两部分,一部分为热数据区域,一部分为冷数据区域。如下图所示:

当数据页第一次被加载到缓冲池中的时候,先将其放到冷数据区域的链表头部,1s(由 innodb_old_blocks_time参数控制)后该缓存页被访问了再将其移至热数据区域的链表头部。如下图所示:

2.2 查询缓存

A: 那么什么是查询缓存呢?
Q: 查询缓存是提前把 查询结果缓存 起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL 中的查询缓存,不是缓存查询计划,而是查询对应的结果。因为命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

2.3 缓冲池如何读取数据

缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。缓存在数据库中的结构和作用如下图所示:

如果我们执行 SQL 语句的时候更新了缓存池中的数据,那么这些数据会马上同步到磁盘上吗?
实际上,当我们对数据库中的记录进行修改的时候,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘上。注意并不是每次发生更新操作,都会立刻进行磁盘回写。缓冲池会采用一种叫做checkpoint的机制将数据回写到磁盘上,这样做的好处就是提升了数据库的整体性能。
比如,当缓冲池不够用时,需要释放掉一些不常用的页,此时就可以强行采用checkpoint的方式,将不常用的脏页回写到磁盘上,然后再从缓冲池中将这些页释放掉。这里脏页(dirty page)指的是缓冲池中被修改过的页,与磁盘上的数据页不一致。

2.4 查看/设置缓冲池大小

如果你使用的是 InnoDB 存储引擎,可以通过查看 innodb_buffer_pool_size 变量来查看缓冲池的大小。命令如下:

show variables like 'innodb_buffer_pool_size';

服务器内存为1G时:

服务器内存为4G时:

你能看到此时 InnoDB 的缓冲池大小只有 1073741824/1024/1024=1024MB=1G。我们可以修改缓冲池大小,比如改为256MB,方法如下:

 set global innodb_buffer_pool_size = 268435456;

或者修改配置文件:

[server]
innodb_buffer_pool_size = 268435456

2.5 多个Buffer Pool实例

[server]
innodb_buffer_pool_instances = 2

这样就表明我们要创建2个 Buffer Pool 实例。
我们看下如何查看缓冲池的个数,使用命令:

show variables like 'innodb_buffer_pool_instances';

那每个 Buffer Pool 实例实际占多少内存空间呢?其实使用这个公式算出来的:
innodb_buffer_pool_size/innodb_buffer_pool_instances
也就是总共的大小除以实例的个数,结果就是每个 Buffer Pool 实例占用的大小。

MySQL缓冲池-Buffer Pull相关推荐

  1. 缓冲多少数据_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  2. 分页缓冲池占用很高怎么解决_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理...

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  3. MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 MySQL怎么运 ...

  4. mysql分页缓冲池占用很高怎么解决_缓冲池(buffer pool),这次彻底懂了!!!

    https://blog.csdn.net/weixin_40009393/article/details/111103350 应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cac ...

  5. mysql+缓冲池脏块率高_什么是数据库的 “缓存池” ?(万字干货)

    原标题:什么是数据库的 "缓存池" ?(万字干货) 1.Buffer Pool 概述 Buffer Pool 是什么?从字面上看是 缓存池 的意思,没错,它其实也就是 缓存池 的意 ...

  6. 一文了解MySQL的Buffer Pool

    本文分享自华为云社区<MySQL 的 Buffer Pool,终于被我搞懂了>,作者:小林coding . 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffe ...

  7. MySQL 的 Buffer Pool,终于被我搞懂了

    大家好,我是小林. 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffer Pool? 虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样 ...

  8. 阅读笔记 - MySQL Change Buffer

    文章目录 前言 MySQL - Change Buffer 什么是Change Buffer Change Buffer原理 为什么针对非唯一索引页 Change Buffer好处 适合使用场景 相关 ...

  9. 安装MySQL示例   docker pull mysql

    安装MySQL示例   docker pull mysql 错误的启动   docker run --name mysql01 -d mysql 正确的启动 docker run --name mys ...

最新文章

  1. cp: /usr/bin/chromedriver: Operation not permitted
  2. 画布canvas标签,并且在画布上画简单的形状
  3. DedeHttpDown下载类
  4. 面试官:你对Kafka比较熟? 那说说kafka日志段如何读写的吧?
  5. 青少年蓝桥杯_2020_steam考试_初级组_第三题
  6. python字典数组排序sorted_Python利用sorted进行字典排序
  7. Java8-本地缓存
  8. 王彪20162321 2017-2018程序设计与数据结构-第二学期-第一周学习总结
  9. 转一篇矩阵方面有趣的文章
  10. 二项式定理等价变换与简单推论
  11. java排序链表冒泡排序_Java中的冒泡排序
  12. python创建员工_Python综合练习之创建员工信息表
  13. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式
  14. 怎么把微信机器人挂在服务器上,微信群机器人怎么弄的群里面的机器人怎么弄的???...
  15. CPU频率和单位换算
  16. 一个离职程序员的找工作历程(2021.4.28更新)
  17. html中左三角怎么写,css3三角形怎么写?
  18. 谷歌插件扩展破解禁止复制粘贴
  19. 强化学习训练营-学习笔记
  20. 情侣积分微信小程序零基础开发教程(附代码及开发指南)

热门文章

  1. c语言 floyd优化,Floyd(弗洛伊德)算法(C语言)
  2. [水文]论文极简记录
  3. win10开启键盘灯的步骤
  4. 指向数组元素的指针和指针数组
  5. 《财富》推荐的75本必读书 (修订版)
  6. 安装SecureCRT和SecureFX踩过得坑
  7. 观察者模式ApplicationListener异步处理事件
  8. 数学建模:插值与拟合—插值问题的python求解
  9. 小白如何学习操作系统?
  10. indesign java_InDesign必杀技,分分钟秒出方案排版(附ID排版模板)