缓存的重要性

我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来,这样将来有请求再次访问该页面时,就可以省去磁盘IO的开销了。这样能够大大的增加效率。

InnoDB的Buffer Pool

Buffer Pool的概念

设计InnoDB的大叔为了缓存磁盘中的页,在MySQL服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做Buffer Pool(中文名是缓冲池)。那它有多大呢?这个其实看我们机器的配置,如果你是土豪,你有512G内存,你分配个几百G作为Buffer Pool也可以啊,当然你要是没那么有钱,设置小点也行呀~ 默认情况下Buffer Pool只有128M大小。当然如果你嫌弃这个128M太大或者太小,可以在启动服务器的时候配置innodb_buffer_pool_size参数的值,它表示Buffer Pool的大小,就像这样: [server] innodb_buffer_pool_size = 268435456 其中,268435456的单位是字节,也就是我指定Buffer Pool的大小为256M。需要注意的是,Buffer Pool也不能太小,最小值为5M(当小于该值时会自动设置成5M)。

Buffer Pool内部结构

Buffer Pool中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是16KB。为了更好的管理这些在Buffer Pool中的缓存页,设计InnoDB的大叔为每一个缓存页都创建了一些所谓的控制信息,这些控制信息包括该页所属的表空间编号、页号、缓存页在Buffer Pool中的地址、链表节点信息、一些锁信息以及LSN信息。 每个缓存页对应的控制信息占用的内存大小是相同的,我们就把每个页对应的控制信息占用的一块内存称为一个控制块吧,控制块和缓存页是一一对应的,它们都被存放到 Buffer Pool 中,其中控制块被存放到 Buffer Pool 的前边,缓存页被存放到 Buffer Pool 后边,所以整个Buffer Pool对应的内存空间看起来就是这样的:

每一个控制块都对应一个缓存页,那在分配足够多的控制块和缓存页后,可能剩余的那点儿空间不够一对控制块和缓存页的大小,自然就用不到喽,这个用不到的那点儿内存空间就被称为碎片了。当然,如果你把Buffer Pool的大小设置的刚刚好的话,也可能不会产生碎片~

free链表的管理

因为我们没法得意buffer pool的那些内存被使用了,也没有办法哪些是空闲的能够被使用的,所以我们用控制块来管理缓存页,控制块里有一个free链表来管理缓存页的使用情况。

有了这个free链表之后事儿就好办了,每当需要从磁盘中加载一个页到Buffer Pool中时,就从free链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上(就是该页所在的表空间、页号之类的信息),然后把该缓存页对应的free链表节点从链表中移除,表示该缓存页已经被使用了~

缓存页的哈希处理

我们如何去访问某个数据呢,如果数据加载到buffer pool中,我们怎么才能准确的知道,这个内容是不是已经加载到了beffer pool中呢,是这样的,我们其实是通过表空间号+页号当作key通过hash算法来定位,缓存页就是一个value,通过hash表的方式,去寻址如果有的话就直接使用,如果没有的话,我们就把数据从磁盘中加载进来。

flush链表的管理

如果beffer pool其中某一页的数据被修改,那么她就和磁盘中的数据不一致了,我们给这种数据一个状态,我们称它是dirty,当然最简单的方法是一被修改我们立刻刷新到磁盘中保持高度的一致性,但是频繁的刷盘会影响性能,所以一般情况下,我们都是到某一个时间点或者某一个条件然后去刷盘的。那么我们如何才能快速的定位到需要刷盘的数据呢,也就是我们所说的dirty page。其实缓存页一被修改我们就把放到了一个专门放dirty page的链表中,我们称它为flush链表,当需要刷盘的时候一起进行刷盘。

LRU链表的管理

其实beffer pool其实也不是无限大的,最后肯定会有满的时候,那么我们应该怎么去删除数据让新的数据加载进来呢,答案肯定是最近使用频率低肯定要首先淘汰,下面要说的肯定就是著名的lru淘汰算法,还有一定要注意的就是如果我们淘汰一个数据的时候一定要确定它是否是dirty page如果是的话那么就不能淘汰因为还没有同步到磁盘,这样的话就造成数据丢失。

mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool相关推荐

  1. mysql 事务返回值_MySQL 的事务与 ACID

    所谓事务(Transaction),就是通过确保成批的操作要么完全执行,要么完全不执行,来维护数据库的完整性.举一个烂大街的例子:A 向 B 转账 1000 元,对应的 SQL 语句为:(没有显式定义 ...

  2. mysql 函数返回值_MySQL函数--(1)

    /* 函数与存储过程的区别 1.存储过程:可以有0个返回值,可以有多个返回值 函数:有且仅有一个返回值 */ #创建语法 create FUNCTION 函数名(参数列表) return 返回类型 B ...

  3. mysql procedure返回值_mysql procedure 返回结果集

    mysql procedure 没有return参数 可以out一个变量给客户端 但是out参数又不支持游标类型,如何能out出一个结果集呢? 方法很简单 就是在procedure里执行一个selec ...

  4. Java 工程师成神之路 | 2019正式版 1

    Java 工程师成神之路 | 2019正式版 基础篇 01 面向对象→ 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM ...

  5. Java工程师成神之路 | 2022正式版

    基础篇 面向对象 什么是面向对象 面向对象与面向过程 面向对象的三大基本特征 面向对象的五大基本原则 封装.继承.多态 什么是多态 方法重写与重载 Java的继承与实现 Java的继承与组合 构造函数 ...

  6. 阿里P8资深架构师耗时一年整理Java工程师成神之路

    1.基础篇 01:面向对象 → 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM 还支持哪些语言(Kotlin.Groov ...

  7. (上)史上最全 Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)

    1.前言 看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗? 大数据羊说__的文章会让你明白 博主会阐明博主期望本文能给小伙伴们带来什么帮助,让小伙伴萌能直观明白博主的心思 博主会以实际的 ...

  8. vim 成“神“之路 (一)

    文章目录 1. 安装 1.1 linux 1.2 MacOs的安装 1.3 Windows的安装 1.4 vim中文帮助文档安装 2. vim基本概念和基础命令 2.1 基本的键位映射如下: 2.2 ...

  9. MySQL - InnoDB特性 - Buffer Pool漫谈

    转载自  MySQL - InnoDB特性 - Buffer Pool漫谈 缓存管理是DBMS的核心系统,用于管理数据页的访问.刷脏和驱逐:虽然操作系统本身有page cache,但那不是专门为数据库 ...

最新文章

  1. 创业思维 - Qunar的故事
  2. 成功解决Instructions for updating:  Use `tf.global_variables_initializer` instead.
  3. 国内互联网广告生态现状【计算广告】
  4. 小a的计算器(牛客签到题A)-简单模拟
  5. ASP.NET - MVC框架及搭建教程
  6. 【英语学习】【English L06】U08 News L5 They are expecting a baby!
  7. python在文件中写入字典_python初学--文件操作、字典
  8. Cesium应用篇:3控件(1)Clock
  9. 地图转换|用arcgis 将cad转kmz
  10. CSS 颜色代码大全 CSS颜色对照表
  11. 基于springboot,vue图书管理系统
  12. sqlite数据库可视化工具—— DB.Browser安装说明
  13. 生信技能树 WES分析教程学习(1)conda安装软件,配置环境
  14. junit5 入门系列教程-13-junit5 测试接口及默认方法
  15. 莫比乌斯反演入门题目(详细)
  16. 将IP地址转换为整数--将32位的二进制转换为十进制
  17. KSO--阿里云部署NetCore项目无法通过端口号访问
  18. 【BSP视频教程】STM32H7视频教程第3期:整体捋顺STM32H7的HAL库和LL库的框架,再配合寄存器造轮子找到更适合自己的玩法(2022-01-21)
  19. 基于手持技术的中学化学实验教学研究
  20. 信号系统中使用的继电器

热门文章

  1. 指定的服务器无法运行请求操作_服务器无法正常运行?也许是这3个原因导致的!...
  2. python可以制作网站吗_Python大神带你用30行代码打造一个网站,爬虫+web不一样的玩法...
  3. python3.9出了吗_Python 3.9 正式版要来了,会有哪些新特性?
  4. python连接服务器代码_python服务器端收发请求的实现代码
  5. python逐个读取文件_在Python中多次读取同一文件
  6. 查看coo_matrix的shape
  7. brew更新的时候不更新某个应用_这样用 Git 想不升职加薪都难!
  8. 在Opendaylight中karaf启动的时候自动安装自己编写的feature
  9. js中const,var,let区别与用法
  10. 笔记-高项案例题-2015年上-进度管理-质量管理