目 录CONTENT

文章目录

查询缓存 - InnoDB的buffer pool

FatFish1
2025-05-16 / 0 评论 / 0 点赞 / 18 阅读 / 0 字 / 正在检测是否收录...

buffer pool

缓存存在的意义

因为innodb是以文件系统存储数据的,即一个一个idb文件,每次查询都走I/O肯定是太慢了,因此innodb在内存中申请了一块空间,即buffer pool

因为页是操作单元,因此buffer pool的单位也是页

默认配置是128M,也可以使用启动参数修改

[server] 
innodb_buffer_pool_size = 268435456

buffer pool的结构

主体数据部分是页,每个页对应一个控制块,记录页的一些信息

除此之外,可能会有一小块数据啥也放不进去,变成碎片空间

buffer pool中的空闲页对应的控制块组成了一个链表,叫free链表,方便找空间

LRU链表管理

因为是缓存,就一定有逐出策略,buffer pool使用的是LRU策略,即最近访问

因此执行SELECT后,会把最近使用的页全塞进去

如果查询内容过多,一次性塞的太多,可能会把一些老的热点数据给逐出出去,这就是所谓的SELECT语句命中缓存

InnoDB也是很想优化这种问题的,采取的策略和JVM策略差不多,搞了young区和old区

缓存优化查询方案

预读

是InnoDB 认为执行当前的请求可能之后会读取某些页面,就预先把它们加载到 Buffer Pool 中。

根据触发方式的不同,预读又可以细分为下边两种:

  • 线性预读:通过系统变量innodb_read_ahead_threshold控制,如果顺序访问了某个区域且达到阈值,就会自动加载后面的区域

  • 随机预读:如果Buffer Pool已经缓存了某个区的13个连续页面(不管是不是一次读进来的,可能是多次SELECT),Buffer Pool就会把整改区加载进来

避免全表扫描

避免全表扫描给buffer pool带来一次大量的逐出,把之前一些热点数据给干没了

0

评论区