带你了解MySQL中的数据库缓冲池(Buffer Pool)


带你了解MySQL中的数据库缓冲池(Buffer Pool)

对于使用InnoDB存储引擎的表来说,是以页为单位来管理存储空间的,作为内存和磁盘之间换入换出的基本粒度。当我们将某页从磁盘中加载到内存中,会进行磁盘I/O。而磁盘I/O的开销非常影响整体性能,如果我们直接从内存中读取相应的页,那岂不是减少了磁盘I/O带来的性能损耗,效率则会提升很多。基于此,缓冲池(Buffer Pool) 出现了,那么接下来,我们就来谈谈InnoDB中的Buffer Pool。

缓冲池(Buffer Pool)

有人会想,既然缓冲池这么好,那我们将所有数据都存储到缓冲池中不就好了,不不不,缓冲池是操作系统分配的一片连续的内存。而内存相比于磁盘的容量小得多,并且价格昂贵。那么操作系统会给缓冲池分配多少内存呢?

  • 默认情况下,缓冲池的大小为128MB;

当然,如果你的机器的内存容量非常大,可以在配置文件中配置启动选项参数innodb_buffer_pool_size单位是字节,最小不能小于5MB。

缓冲池的内部结构

缓冲池将操作系统分配的这一片连续的内存,划分成若干个大小默认为16KB的页(缓冲页)【此时还没有真正的磁盘页被缓存到Buffer Pool中】,当我们从磁盘中换入一个页到缓冲池中,如何分配位置呢?因此就需要一些控制信息来标识这些缓冲池中的缓冲页,这些控制信息都存放在一个叫控制块的内存区域中,与缓冲页一一对应。控制块的大小也是固定的。因此在这片连续的内存空间中,难免会产生内存碎片。综上,缓冲池的内部结构如下:

  • 缓冲页
  • 控制块:页号、缓冲页在缓冲池中的地址、链表节点信息等。
  • 内存碎片【若内存分配得当,内存碎片可有可无】

image-20230207185817685.png

缓冲池的管理

上面在控制块中提到了链表节点信息,那么链表节点是用来做什么的呢?是为了更好的管理缓冲池中的页。而链表就是用来链接控制块的,因为控制块与缓冲页是一一对应的。

1)空闲链表

将所有空闲的缓冲页对应的控制块链接起来,形成的链表。

解决的问题:从磁盘中换入一个页到缓冲池中,如何区分缓冲池中的哪个页是空闲的呢?而有了空闲链表之后,换入一个磁盘页到缓冲池中时,就直接从空闲链表中获取一个空闲的缓冲页,并将磁盘页中对应的信息填到缓冲页对应的控制块中,然后将该控制块从空闲链表中删除即可。

2)更新链表

若修改了缓冲池中的缓冲页的数据,导致其与磁盘中数据不一致,该页称为脏页。将所有脏页对应的控制块链接起来形成更新链表,在将来的某个时间根据该链表将对应缓存页的数据刷新到磁盘中。

3)LRU链表

缓冲池的大小是有限的,如果缓存的页超出了缓冲池的大小,即没有空闲的缓冲页了,当有新的页要添加到缓冲池中时,采取LRU的策略将旧的缓冲页从缓冲池中移除,然后将新的页添加进来。由于LRU链表涉及的内容较多,我们接下来单独介绍。

LRU链表所蕴含的“哲理”

先提一下预读机制

在I/O上的优化机制,预读顾名思义,会异步地把某些页面加载到缓冲池中,预计很快就会需要这些页面,这些请求在一个范围内引入所有页面,就是所谓的 局部性原理,目的是减少磁盘I/O。

了解预读机制之前,先回顾一下InnoDB逻辑存储单元:表空间(tablespace)→段(segment )→区(extent)→页(page)。其中特意提一下区,后面会用到:一个区就是物理位置上连续的64个页,即一个区的大小是1MB.

image-20230207175618986.png

预读机制可以细分为以下两种:

  • Linear read-ahead(线性预读):一种基于按顺序访问的缓冲池中的页面来预测可能很快需要哪些页面的技术。通过配置参数innodb_read_ahead_threshold,若顺序访问的某个区的页面超过这个参数的值,会触发异步读请求来读取下一个区中全部的页面到缓冲池中。
  • Random read-ahead(随机预读):可以根据缓冲池中已经存在的页面预测何时可能需要页面,而不管这些页面的读取顺序如何。如果在缓冲池中发现同一个区段的13个连续页面,InnoDB会异步发出一个请求来预取该区段的剩余页面。通过配置变量innodb_random_read_ahead来控制随机读的。

传统LRU对缓冲页是如何管理的呢?

利用LRU算法对最近最少使用的缓冲页进行管理,形成对应的链表,方便用于淘汰。

当访问一个页【即最近访问】

  • 该页在缓冲池中,将对应控制块移至LRU链表头部
  • 该页不在缓冲池中,淘汰尾部最近最少使用的页,从磁盘中加载进来该页并放在LRU链表头部

那么为什么InnoDB不使用这么直观的LRU算法呢?原因如下:

一览妙笔 一览妙笔

自媒体、编剧、营销人员写作工具

一览妙笔 50 查看详情 一览妙笔
  1. 预读失效

    预读到缓冲池中的页都会放到LRU链表的头部,但其中很多页可能并不会被读取。

  2. 缓冲池污染

    很多使用频率较低的页加载到缓冲池中,会把使用频率较高的页从缓冲池中淘汰掉。比如全表扫描

优化后的LRU对缓冲页是如何管理的呢?

基于上述缺点,优化后的具体方法将传统LRU链表划分为两部分:热数据区域【年轻区】&冷数据区域【老年区】

  • 热数据区域【年轻区】:使用频率高的缓冲页
  • 冷数据区域【老年区】:使用频率低的区域

结构简图如下所示:

如图所示,热数据区域与冷数据区域分别占用不同比例,那么我们可以通过innodb_old_blocks_pct启动选项来控制冷数据区域所占比例。

image-20230207185041838.png

改进后的LRU如何更好的解决预读失效问题呢?

  • 某个页在初次加载到缓冲池中时,先淘汰掉冷数据区域尾部的控制块(即其对应的页淘汰掉),然后新页对应的控制块会先放到冷数据区域的头部。
  • 若后续该页不被进行访问就会慢慢从冷数据区域中被淘汰掉,总体不会影响热数据区域访问频繁的缓冲页。

改进后的LRU如何更好的解决缓冲池污染问题呢?

先说结论,并没有很好的优化这个问题,原因如下【以全表扫描为例】:

  • 某个初次访问的页同样会放到冷数据区域的头部,但后续访问又会将其放到热数据区域的头部,这样同样会把访问频率较高的页给挤掉。

那么到底该如何解决缓冲池污染问题呢?

  • 缓冲池引入了冷数据区域时间窗口机制,即只有后续访问该页与第一访问该页的时间间隔大于规定的窗口值,就会将该页从冷数据区域移到热数据区域的头部。小于规定的窗口值,就不会进行移动操作。
  • 同样,窗口值可通过innodb_old_blocks_time参数【单位ms】来设置,默认1000ms,而1s会筛选掉大部分像全表扫描这样的操作。比如在一次全表扫描过程中,多次访问一个页面的时间间隔不会超过1s。

缓冲池VS查询缓存

缓冲池和查询缓存是一个东西吗?→不是

  • 缓冲池会尽量将经常使用的数据保存起来,在MySQL进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。
  • 查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

【相关推荐:mysql视频教程】

以上就是带你了解MySQL中的数据库缓冲池(Buffer Pool)的详细内容,更多请关注其它相关文章!


# 较高  # 板材网站推广怎么样  # 铜梁区大数据seo优化  # 高端网站建设费用价格  # 化工网站优化企业推广  # 做网站与推广  # 顺德b2b全网营销推广  # seo软件领域  # 网站域名优化方案  # 南阳搜索关键词排名  # 推广营销平台排名前十名  # 操作系统  # MySQL  # 带你  # 使用频率  # 加载  # 就会  # 该页  # 镜像  # 链表  # 池中  # 面试  # 后端 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: lol小红书怎么|直播|?lol小红书|直播|是什么意思?  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  《三国:谋定天下》平民全阶段通用阵容  使用document.execCommand实现Web文本编辑器加粗/取消加粗  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  windows10怎么更改下载路径_windows10默认存储位置修改教程  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  CodeIgniter 3 连接 SQL Server:正确获取查询结果的教程  六级准考证号怎么查_四六级准考证查询入口官网  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  Win10关闭UAC用户账户控制的方法 Win10降低安全提示等级【技巧】  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  composer licenses 命令:如何检查项目依赖的许可证?  漫蛙漫画直连入口 _ manwa官方备用入口实时检测  《偃武》甘宁技能详解  韩剧圈正版官网入口_韩剧圈官方指定登录  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  b站网页版入口 哔哩哔哩官方网站直接进入  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  花生壳内网映射新方案  百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  qq音乐官方网站入口_qq音乐在线听歌网页版链接  Three.js中动态更换3D模型纹理的教程  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  汽车之家网页版免费登录_汽车之家官网首页直接进入  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  《小黑盒》删除历史浏览方法  雨课堂官网在线登录 网页版雨课堂登录链接  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  优化Google Charts Gauge:在数据库无数据时显示默认值  《糖豆》添加舞曲方法  b站如何管理订阅_b站订阅标签分类管理  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  word页码灰色不能用如何解决  《下一站江湖2》大雪山加入方法  J*aScript包管理器_Npm与Yarn对比  C++ static关键字作用_C++静态成员变量与静态函数  德邦快递收费标准详解  Go Goroutine调度与并发执行深度解析  中大网校app做题记录清除方法  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  解决CSS布局中意外顶部空白问题的教程 

 2023-02-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.