带你了解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 】


相关推荐: HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  《随手记》启用语音备注方法  支付宝登录刷脸不是本人如何解决  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  百度识图图像分析 百度识图识别平台  php如何实现多域名共享session_php存储session到redis与跨域读取配置  J*aScript装饰器_元编程实战  店铺如何做视频号推广?做视频号推广有用吗?  申通快递查询 申通物流快递单实时查询入口  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  ao3入口镜像地址 ao3镜像入口可靠跳转  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  《绿竹漫游》关闭消息通知方法  《健康大兴》注册方法介绍  windows10怎么开启wsl_windows10安装linux子系统教程  《大学搜题酱》官网地址登录  VS Code如何设置默认配置  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  《伊瑟》凶影追缉库卢鲁boss攻略  魔法祈幻界兑换码礼包大全  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  《腾讯相册管家》注销账号方法  word页码灰色不能用如何解决  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  鸣潮历史学家灯塔位置一览  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  《雷电模拟器》截图方法介绍  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  《下一站江湖2》独孤剑诀习得方法  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  《百度畅听版》关闭兴趣推荐方法  139邮箱登录入口官网 139邮箱登录入口官网网址  《下一站江湖2》武器获取方法  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  FotoBalloon图片左右镜像教程  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  126手机126邮箱登录_126邮箱手机登录入口官网  Golang如何初始化module项目_Golang module init使用说明  优化2xN网格最大路径和的动态规划算法实践  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  使用Python和NLTK从文本中高效提取名词的实用教程  韩剧圈正版官网入口_韩剧圈官方指定登录  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  MacBook Pro词典使用指南  如何在vscode中关闭it环境 

 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.