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 污染的问题 。

相关推荐
睡觉的时候不会困3 小时前
Redis 主从复制详解:原理、配置与主从切换实战
数据库·redis·bootstrap
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
自学也学好编程5 小时前
【数据库】Redis详解:内存数据库与缓存之王
数据库·redis
福赖5 小时前
《MySQL基础——用户管理》
mysql·用户管理
JAVA不会写6 小时前
在Mybatis plus中如何使用自定义Sql
数据库·sql
IT 小阿姨(数据库)6 小时前
PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法
linux·运维·数据库·sql·postgresql·centos
ChinaRainbowSea6 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
小马学嵌入式~7 小时前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
Java小白程序员8 小时前
MyBatis基础到高级实践:全方位指南(中)
数据库·mybatis
Monly218 小时前
人大金仓:merge sql error, dbType null, druid-1.2.20
数据库·sql