MySQL—buffer pool

一、buffer pool的介绍

Buffer pool是什么

一个内存区域,为了提⾼数据库的性能,数据库操作数据的时候,把硬盘上的数据加载到buffer pool,不直接和硬盘打交道,操作的是 buffer pool的数据,数据库的增删改查都是在 buffer pool 上进行

Buffer pool 有多大

Buffer Pool 是在 MySQL 启动的时候,向操作系统申请的一片连续的内存空间,默认配置下 Buffer Pool 只有 128MB 。

Buffer Pool 缓存什么?

二、Buffer pool如何管理

其中「有三大双向链表」:

「free 链表」

• ⽤于帮助我们找到空闲的缓存⻚

「flush 链表」

• ⽤于找到脏缓存⻚,也就是需要刷盘的缓存⻚

「lru 链表」

• ⽤来淘汰不常被访问的缓存⻚,分为热数据区和冷数据区,冷数据区主要存放那些不常被用到的数据

简单的 LRU 算法并没有被 MySQL 使用,因为简单的 LRU 算法无法避免下面这两个问题:

  • 预读失效;
  • Buffer Pool 污染;

预读失效是什么?

MySQL 在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是为了减少磁盘 IO。

但是可能这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了,这个就是预读失效。

预读失效解决方案

改进了 LRU 算法,将 LRU 划分了 2 个区域:old 区域 和 young 区域(63:37)。划分这两个区域后,预读的页就只需要加入到 old 区域的头部,当页被真正访问的时候,才将页插入 young 区域的头部。如果预读的页一直没有被访问,就会从 old 区域移除,这样就不会影响 young 区域中的热点数据。

什么是 Buffer Pool 污染?

当某一个 SQL 语句扫描了大量的数据时 ,在 Buffer Pool 空间比较有限的情况下,可能会将 Buffer Pool 里的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问的时候,由于缓存未命中,就会产生大量的磁盘 IO,MySQL 性能就会急剧下降,这个过程被称为 Buffer Pool 污染

缓存污染解决方案

只有同时满足「被访问」与「在 old 区域停留时间超过 1 秒」(innodb_old_blocks_time 阈值(默认为1秒))两个条件,才会被插入到 young 区域头部,这样就解决了 Buffer Pool 污染的问题 。

相关推荐
稚辉君.MCA_P8_Java23 分钟前
WebSocket 是什么原理?为什么可以实现持久连接?
网络·数据库·websocket·网络协议
小光学长42 分钟前
基于Vue的图书馆座位预约系统6emrqhc8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
code小毛孩1 小时前
如何简单的并且又能大幅度降低任务队列的锁粒度、提高吞吐量?
java·jvm·数据库
风随心飞飞2 小时前
linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
linux·数据库·mysql
奥尔特星云大使2 小时前
读写分离中间件简介
数据库·mysql·中间件·读写分离
友莘居士2 小时前
高效处理 Excel 海量数据入库:编程脚本、CSV 中间件、图形工具优化全攻略
数据库·中间件·excel·csv·海量数据·入库
Han.miracle3 小时前
数据库圣经第二章——简单的my.ini基础配置介绍
数据库
八怪4 小时前
KILL MTS的一个worker线程会怎么样
数据库
disanleya4 小时前
MySQL数据库安装后,如何设置自动化备份策略?
mysql
奥尔特星云大使4 小时前
mysql高可用架构之MHA部署(二)VIP漂移(保姆级)
android·mysql·架构·mha·ip漂移