
对于使用InnoDB存储引擎的表来说,是以页为单位来管理存储空间的,作为内存和磁盘之间换入换出的基本粒度。当我们将某页从磁盘中加载到内存中,会进行磁盘I/O。而磁盘I/O的开销非常影响整体性能,如果我们直接从内存中读取相应的页,那岂不是减少了磁盘I/O带来的性能损耗,效率则会提升很多。基于此,缓冲池(Buffer Pool) 出现了,那么接下来,我们就来谈谈InnoDB中的Buffer Pool。
有人会想,既然缓冲池这么好,那我们将所有数据都存储到缓冲池中不就好了,不不不,缓冲池是操作系统分配的一片连续的内存。而内存相比于磁盘的容量小得多,并且价格昂贵。那么操作系统会给缓冲池分配多少内存呢?
当然,如果你的机器的内存容量非常大,可以在配置文件中配置启动选项参数innodb_buffer_pool_size单位是字节,最小不能小于5MB。
缓冲池将操作系统分配的这一片连续的内存,划分成若干个大小默认为16KB的页(缓冲页)【此时还没有真正的磁盘页被缓存到Buffer Pool中】,当我们从磁盘中换入一个页到缓冲池中,如何分配位置呢?因此就需要一些控制信息来标识这些缓冲池中的缓冲页,这些控制信息都存放在一个叫控制块的内存区域中,与缓冲页一一对应。控制块的大小也是固定的。因此在这片连续的内存空间中,难免会产生内存碎片。综上,缓冲池的内部结构如下:

上面在控制块中提到了链表节点信息,那么链表节点是用来做什么的呢?是为了更好的管理缓冲池中的页。而链表就是用来链接控制块的,因为控制块与缓冲页是一一对应的。
将所有空闲的缓冲页对应的控制块链接起来,形成的链表。
解决的问题:从磁盘中换入一个页到缓冲池中,如何区分缓冲池中的哪个页是空闲的呢?而有了空闲链表之后,换入一个磁盘页到缓冲池中时,就直接从空闲链表中获取一个空闲的缓冲页,并将磁盘页中对应的信息填到缓冲页对应的控制块中,然后将该控制块从空闲链表中删除即可。
若修改了缓冲池中的缓冲页的数据,导致其与磁盘中数据不一致,该页称为脏页。将所有脏页对应的控制块链接起来形成更新链表,在将来的某个时间根据该链表将对应缓存页的数据刷新到磁盘中。
缓冲池的大小是有限的,如果缓存的页超出了缓冲池的大小,即没有空闲的缓冲页了,当有新的页要添加到缓冲池中时,采取LRU的策略将旧的缓冲页从缓冲池中移除,然后将新的页添加进来。由于LRU链表涉及的内容较多,我们接下来单独介绍。
在I/O上的优化机制,预读顾名思义,会异步地把某些页面加载到缓冲池中,预计很快就会需要这些页面,这些请求在一个范围内引入所有页面,就是所谓的 局部性原理,目的是减少磁盘I/O。
了解预读机制之前,先回顾一下InnoDB逻辑存储单元:表空间(tablespace)→段(segment )→区(extent)→页(page)。其中特意提一下区,后面会用到:一个区就是物理位置上连续的64个页,即一个区的大小是1MB.

预读机制可以细分为以下两种:
利用LRU算法对最近最少使用的缓冲页进行管理,形成对应的链表,方便用于淘汰。
当访问一个页【即最近访问】
那么为什么InnoDB不使用这么直观的LRU算法呢?原因如下:
一览妙笔
自媒体、编剧、营销人员写作工具
50
查看详情
预读失效
预读到缓冲池中的页都会放到LRU链表的头部,但其中很多页可能并不会被读取。
缓冲池污染
很多使用频率较低的页加载到缓冲池中,会把使用频率较高的页从缓冲池中淘汰掉。比如全表扫描
基于上述缺点,优化后的具体方法将传统LRU链表划分为两部分:热数据区域【年轻区】&冷数据区域【老年区】
结构简图如下所示:
如图所示,热数据区域与冷数据区域分别占用不同比例,那么我们可以通过innodb_old_blocks_pct启动选项来控制冷数据区域所占比例。

改进后的LRU如何更好的解决预读失效问题呢?
改进后的LRU如何更好的解决缓冲池污染问题呢?
先说结论,并没有很好的优化这个问题,原因如下【以全表扫描为例】:
那么到底该如何解决缓冲池污染问题呢?
innodb_old_blocks_time参数【单位ms】来设置,默认1000ms,而1s会筛选掉大部分像全表扫描这样的操作。比如在一次全表扫描过程中,多次访问一个页面的时间间隔不会超过1s。缓冲池和查询缓存是一个东西吗?→不是
【相关推荐: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
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。