快速搞懂 Mysql 中 BufferPool 底层原理
🍁 作者:知识浅谈,CSDN 签约讲师,CSDN 博客专家,华为云云享专家,阿里云专家博主
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
🔥 联系方式 vx:zsqtcc
🤞快速搞懂 Mysql 中 BufferPool 底层原理🤞
正菜来了⛳⛳⛳
🎈BufferPool 缓冲池
缓冲池处于计算机系统主存中的某个区域,用于 InnoDB 访问时缓存表以及索引数据。缓冲池允许直接从内存访问常用数据,从而加快处理速度。在专用服务器上,通常多达 80%的物理内存分配给缓冲池。
把磁盘中一页页的 16k 数据原封不动的加载到 bufferpool 中
为了提高大量的读取操作,缓冲池被划分成可能包含多行的页。为了有效管理这些页的数据,缓冲池被实现为以页为元素的链表。
通过一种变体的 LRU 算法(Least Recently Used Algorithm,最近最少使用算法)使最近最少使用的数据老化(即清除不常用的缓存)。
🎈缓冲池中 LRU 算法
缓冲池使用 LRU 算法的变体形成一个列表进行管理,结构如下图所示。当缓冲池需要添加新页的时候,最近最少使用的页会被驱逐,并且一个新页会被添加到列表的中间(注意,并不是列表的正中间,具体值由 LU 算法的变体决定)。这个中点插入策略将缓冲池列表逻辑上分割成两个子列表。
列表头部至中间点的数据,被视为是最近常访问的,下文称这些为年轻页
中间点至列表尾部的数据,被视为最近较少访问的,下问称这些为旧页
默认情况下,操作如下:
缓冲池的 3/8 专用于引旧子列表
列表的中点是新子列表尾部与引旧子列表头部的边界·当 oDB 读取页到缓冲池时,它会初始化地将它插入到中间点(即旧子列表的头部)。一页可以被读取是因为这是用户启动的操作(比如一个 SQL 查询)或者是 InnoDB 预读操作的一部分。
访问旧子列表中的页会使这个页变得年轻,该页会被移动到新子列表的头部。移动的触发时机取决于页被读取的原因(用户启动的操作或者 1noDB 的预读操作)。如果页读取是由于用户启动的操作而引起的,第一次访问页后会立即将页移动到新子列表的头部。如果页读取是 InnoDB 预读操作引起的,第一次访问页后不会立即发生移动页的操作,或者直到该页被驱逐都不会发生,
随着数据库的运行,缓冲池中未被访问的页会通过向列表尾部移动来来“老化”(即被驱逐的概率加大)。新旧子列表的页会随着其他页的更新而被老化。旧子列表的页也会随着插到中间点的页而老化。最终,一个未使用的页面到达旧子列表的尾部并被驱逐。
🎈缓冲池提升性能
理想地,你可以根据实际情况将缓冲池的大小设置得尽可能大,从而留出足够多的内存给服务器上的其他进程运行,而不会出现过多的分页。缓冲池越大,noDB 就越像一个内存数据库,从磁盘读取数据一次,后续的读取期间从内存访问数据。详情见配置 InnoDB 缓冲池大小。
在具有足够内存的 64 位系统上,您可以将缓冲池拆分成多个部分,以减少并发操作之间对内存结构的争用。详情见配置多个缓冲池实例。
你可以将经常访问的数据保留在内存中,而不管操作的活动突然激增,这些操作会将大量不常用的数据带入缓冲池。详情见使缓冲池扫描具有抵抗性
你可以控制如何以及何时执行预读取请求来将分页异步地预取到缓冲池中,以应对即将到来的需求。详情见配置 InnoDB 缓冲池预取(预读)
你可以控制后台何时刷新以及是否根据工作负载动态调整刷新速率。详情见配置缓冲池刷新
你可以配置 1noDB 如何保存当前缓冲池的状态来避免服务器重启后长时间的预热。详情见保存和回复缓冲池的状态
🍚总结
以上就是 Mysql8 中 BufferPool 底层原理英文翻译的部分解析,希望有所帮助。
版权声明: 本文为 InfoQ 作者【知识浅谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/d87db379bda37451812eb4f2d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论