1.简介

buffer pool 就是一个缓存,将磁盘中的数据缓存到内存中,对数据的操作改为通过内存进行操作,然后刷盘的操作,提升性能。

innodb_buffer_pool_size 控制缓存池的大小。

2.内部架构

3. 描述信息

4.free 链表

当我们初始化 buffer pool 之后,会不断的有数据被从磁盘中缓存到 buffer pool 里,但是我们要怎么知道那些缓存页还没有被使用呢 ?

free 链表的主要作用就是维护空闲的缓存页的节点信息

free 链表维护了处于空闲状态的缓存页对应的描述信息,组成了一个双向链表,会有一个基节点,里面存储了空闲节点的个数和头尾节点,同时,基节点是另外申请的一块大约40字节的内存空间,不会占用 buffer pool 的内存

** **

5.flush 链表

基本结构和 free 链表 是一致的,图就不换了,我们在更新一条数据的时候,首先会更新的是 buffer pool 中的数据,这样的话,就导致了缓存中的数据和磁盘中数据不一致的情况,出现这种情况的缓存页我们叫做 脏页 ,脏页的话需要刷新会磁盘中去,所以 flush 链表 主要存放的就是这些 脏页 。

6.哈希表

在 Buffer Pool 有一个专门的哈希表,存储 表空间+页号 为 key , 缓存页地址 为 value 的哈希表,每次读取数据的时候,会先从哈希表中获取,找不到的话,才会从磁盘中将数据缓存到 Buffer Pool 里。

7. lru 链表

因为我们的 Buffer Pool 是受参数影响的,只能容纳参数范围内的数据,因此,我们需要有一个 清除(刷盘)策略 ,将缓存页中的数据刷回到磁盘中去,释放缓存页,将其加入到 free 链表 中,便于下一次从磁盘缓存数据的时候,有空闲的缓存页可以供其使用。

lru 代表最少使用,我们会将命中缓存的数据,放到链表的头部,那么长时间无人使用的缓存页就会被放到链表的尾部,若没有空闲的缓存页的时候,会将链表尾部的缓存中刷新会磁盘,释放缓存页空间,并将该缓存页对应的描述信息添加到 free 链表 中去。

因为 预读 机制的存在,会将一部分 mysql 认为可能下次会读到的数据也加载到缓存页中,因此单纯简单的 lru 链表就会导致一部分后期可能不会读到的数据(例如预读到的数据,或者全表检索的数据),加入到 lru 的头部,可能会将一些频繁访问的数据,挤到后面,导致数据被刷盘,因此,提供了一种 冷热分离 的 lru 链表

lru 链表会将这块区域分为两个部分,热数据区和冷数据区,由参数 innodb_old_blocks_pct 控制,默认为 37 ,也就是冷数据区占整个内存空间的 37%;

从磁盘中加载到的数据,首先会放到 lru 的 冷数据区 的头部,若 在 innodb_old_block_time 间隔之后,还命中了这个缓存页,会将其从冷数据区放到 热数据区 的头部,若在这个时间之前的操作,只是会移动到 冷数据区的头部

当然,也不是每次操作都会移动,这样的话,太消耗性能,规定的是 只有命中热数据区的后四分之三时才会将其移动到热数据区的头部,若命中的缓存页处于热数据区的四分之一前,是不会进行移动的

8.刷新数据到磁盘

会有线程定期的从 flush 链表 中,获取到 脏页 信息,将其刷新回磁盘中,同时将该缓存页对象的描述信息,加入到 free 链表 中

会有线程定期从 lru 链表中 中,从尾部节点臊面数据,由参数 innodb_lru_scan_depth 控制扫描多少。如果发现脏页会进行刷盘操作,同时将该缓存页对象的描述信息,加入到 free 链表 中

有时候,当我们从磁盘缓存到 buffer pool 中,发现没有空闲缓存页的时候,首先会看 Lru 链表尾部有没有未修改的可以直接释放的页面,要是没有的话,只能将尾部的脏页同步到盘里

9. 多个 Buffer Pool 实例

因为我们对 Buffer Pool 的操作,是需要 加锁的 ,因此单个 Buffer Pool 会对性能进行限制,所以我们可以将一块 buffer pool 拆分成多个小 buffer pool 的实例,各自独立

通过 innodb_buffer_pool_instance 参数控制,但如果 innodb_buffer_pool_size 小于 1G 的话,只允许有一个 buffer pool 实例

在 MySQL 5.7.5 之前,是不允许动态调整 buffer pool 的大小的,因为每次调整大小需要重新申请内存空间,并将之前的数据移动到新空间里去,会有很大的性能消耗,因此,在之后更新出了 chunk 的概念

每个 buffer pool 实例中,其实是多个由 chunk 组成的,里面包含各自的描述信息,缓存页等信息,这样我们就可以以 chunk 为单位进行调整整个 Buffer Pool 的空间,由参数 innodb_buffer_pool_chunk_size 控制,默认**128M,**不允许进行动态调整

注意事项

innodb_buffer_pool_size 必须是 innodb_buffer_pool_chunk_size * innodb_buffer_instances 的倍数,如果设置的不是倍数,MySQL 会自动设置为倍数。

mysqld –innodb-buffer-pool-size=8G –innodb-buffer-pool-instances=16

如果 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值已经大于innodb_buffer_pool_size的值,那么innodb_buffer_pool_chunk_size的值会被服务器自动设置为innodb_buffer_pool_size/innodb_buffer_pool_instances的值。

** **

10.查看信息

Total memory allocated:代表Buffer Pool向操作系统申请的连续内存空间大小,包括全部控制块、缓存页、以及碎片的大小。

Dictionary memory allocated:为数据字典信息分配的内存空间大小,注意这个内存空间和Buffer Pool没啥关系,不包括在Total memory allocated中。

Buffer pool size:代表该Buffer Pool可以容纳多少缓存页,注意,单位是页!

Free buffers:代表当前Buffer Pool还有多少空闲缓存页,也就是free链表中还有多少个节点。

Database pages:代表LRU链表中的页的数量,包含young和old两个区域的节点数量。

Old database pages:代表LRU链表old区域的节点数量。

Modified db pages:代表脏页数量,也就是flush链表中节点的数量。

Pending reads:正在等待从磁盘上加载到Buffer Pool中的页面数量。 当准备从磁盘中加载某个页面时,会先为这个页面在Buffer Pool中分配一个缓存页以及它对应的控制块,然后把这个控制块添加到LRU的old区域的头部,但是这个时候真正的磁盘页并没有被加载进来,Pending reads的值会跟着加1。

Pending writes LRU:即将从LRU链表中刷新到磁盘中的页面数量。

Pending writes flush list:即将从flush链表中刷新到磁盘中的页面数量。

Pending writes single page:即将以单个页面的形式刷新到磁盘中的页面数量。

Pages made young:代表LRU链表中曾经从old区域移动到young区域头部的节点数量。

这里需要注意,一个节点每次只有从冷数据区域移动到热数据区域头部时才会将Pages made young的值加1,也就是说如果该节点本来就在热数据区域,由于它符合在热数据区域1/4后边的要求,下一次访问这个页面时也会将它移动到young区域头部,但这个过程并不会导致Pages made young的值加1。

Page made not young:在将innodb_old_blocks_time设置的值大于0时,首次访问或者后续访问某个处在old区域的节点时由于不符合时间间隔的限制而不能将其移动到young区域头部时,Page made not young的值会加1。 这里需要注意,对于处在young区域的节点,如果由于它在young区域的1/4处而导致它没有被移动到young区域头部,这样的访问并不会将Page made not young的值加1。

youngs/s:代表每秒从old区域被移动到young区域头部的节点数量。

non-youngs/s:代表每秒由于不满足时间限制而不能从old区域移动到young区域头部的节点数量。

Pages read、created、written:代表读取,创建,写入了多少页。后边跟着读取、创建、写入的速率。

Buffer pool hit rate:表示在过去某段时间,平均访问1000次页面,有多少次该页面已经被缓存到Buffer Pool了。

young-making rate:表示在过去某段时间,平均访问1000次页面,有多少次访问使页面移动到young区域的头部了。 需要大家注意的一点是,这里统计的将页面移动到young区域的头部次数不仅仅包含从old区域移动到young区域头部的次数,还包括从young区域移动到young区域头部的次数(访问某个young区域的节点,只要该节点在young区域的1/4处往后,就会把它移动到young区域的头部)。

not (young-making rate):表示在过去某段时间,平均访问1000次页面,有多少次访问没有使页面移动到young区域的头部。 需要大家注意的一点是,这里统计的没有将页面移动到young区域的头部次数不仅仅包含因为设置了innodb_old_blocks_time系统变量而导致访问了old区域中的节点但没把它们移动到young区域的次数,还包含因为该节点在young区域的前1/4处而没有被移动到young区域头部的次数。

LRU len:代表LRU链表中节点的数量。

unzip_LRU:代表unzip_LRU链表中节点的数量(由于我们没有具体唠叨过这个链表,现在可以忽略它的值)。

I/O sum:最近50s读取磁盘页的总数。

I/O cur:现在正在读取的磁盘页数量。

I/O unzip sum:最近50s解压的页面数量。

I/O unzip cur:正在解压的页面数量。

mysql 哈希缓存_MySQL Buffer Pool相关推荐

  1. mysql 哈希缓存_MySQL数据库性能优化思路总结

    本文主要是自己记录在MySQL开发学习过程中遇到的数据库新能优化方向 利用缓存 缓存这个方面,可以说是一个技术,也可以说是一个思路和方向 从技术手段上讲 使用一些缓存插件,只需要确定创建.更新缓存的时 ...

  2. mysql buffer pool_MySQL的查询缓存和Buffer Pool

    一.Caches - 查询缓存 下图是MySQL官网给出的:MySQL架构体系图. 人们常说的查询缓存就是下图中的Cache部分. 如果将MySQL分成 Server层和存储引擎层两大部分,那么Cac ...

  3. 缓冲多少数据_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  4. 分页缓冲池占用很高怎么解决_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理...

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  5. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  6. MySQL 5.6 dump/load buffer pool实验

    Using MySQL Preloading Buffer Pool for fast restart. 什么场景下,会使用该功能. 当你的数据库系统较大,比如有128G物理内存,那么对应的buffe ...

  7. mysql 源码 缓存_MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制

    前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢迎 ...

  8. 数据库mysql怎么清空缓存_MySQL数据库如何清空缓存?详细教程在这里

    众所周知,数据库是用来存储数据的.当然数据库根据数据的需求不同分为很多类型.在众多数据库中,MySQL数据库是我们比较常见的,也是应用比较多的.但是很多新手MySQL数据库使用者,对于MySQL数据库 ...

  9. mysql如何设置缓存_mysql中缓存如何设置

    mysql中缓存设置的方法:1.开启自身缓存功能[show variables like "%cache%"]:2.设置的自身缓存为32M[set global query_cac ...

最新文章

  1. 性能调优之Java系统级性能监控及优化
  2. dataset中获取图像的名字_GDAL与OpenCV的图像像素读取格式互相转换
  3. 【转】Nginx系列(五)--nginx+tomcat实现负载均衡
  4. php编程实现单入口,apache配置php实现单一入口方法
  5. 因云而生 | 阿里云发布云服务器操作系统Alinux3
  6. python爬虫基本知识_爬虫 (十三) 学习 python 基础知识点的正确姿势 (六)
  7. ofo 押金被强制理财?黄章回应 OPPO 涉嫌抄袭;三星华为折叠手机重名 | 极客头条...
  8. BZOJ 1507 [NOI2003]Editor
  9. paip.自适应网页设计 跟 响应式 设计方法与工具补充(2)o54
  10. 字符串匹配代码C语言,KMP字符串匹配算法C语言实现
  11. windows idea Tomcat端口被占用
  12. Qt读取海康威视NVR服务器视频
  13. 看懂财务报表一资产负债表
  14. 独自美丽-西西里的美丽传说『by berta』
  15. protocol buffer使用中的问题This is supposed to be overridden by subclasses
  16. 关于墨客的DAPP锁仓开发
  17. 如何正确的从零开始学英语
  18. XCode8 真机测试打包,让发布测试更轻松
  19. 无事,故汉化了一个GBA的小工具
  20. 企业的数字化管理有哪些特点?

热门文章

  1. 关于安徽赛区推广校赛的实施办法
  2. 第十六届全国大学生智能车竞赛线上赛点赛道审核 - 华东赛区
  3. 第十六届智能车竞赛参赛队伍提问-2021-6-15
  4. 创办智能车竞赛平台,十五年无间断,育人数十万
  5. 基于MEGA8的声音CLICK模块
  6. 检测不到信号,是加点噪声?还是滤除噪声?
  7. 双轴机械臂中的闭环步进电机平顺控制算法: 42HS48EIS,57HS
  8. 新车模、新舵机、新体验
  9. springboot项目输入打印日志文件到本地
  10. 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...