[000-002-01].第29节:MySQL数据库缓冲池

news2024/11/14 23:01:08

1、什么是数据缓冲池:

  • 1.InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作),而磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请 占用内存来作为数据缓冲池 ,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问
    在这里插入图片描述
  • 2.这样做好处是可以让磁盘活动最小化,从而减少与磁盘直接进行 I/O 的时间 ,这种策略对提升 SQL 语句的查询性能来说至关重要。如果索引的数据在缓冲池里,那么访问的成本就会降低很多

2、缓冲池 vs 查询缓存

缓冲池和查询缓存不是一个东西

2.1.缓冲池(Buffer Pool)

1.在 InnoDB 存储引擎中,缓冲池都包括了哪些内容??

  • 1.在 InnoDB 存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存的大部分,它用来存储各种数据的缓存,如下图所示:
    在这里插入图片描述
  • 2.从图中,你能看到 InnoDB 缓冲池包括了数据页、索引页、插入缓冲、锁信息、自适应 Hash 和数据字典信息等。每个数据页的大小默认是16kb,可以存储16kb的内容

2.缓冲池的重要性:

  • 1.对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。
  • 2.但是磁盘的速度慢的跟乌龟一样,怎么能配得上"快如风,疾如电"的CPU呢?这里,缓冲池可以帮助我们消除CPU和磁盘之间的鸿沟。所以InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。
  • 3.将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来,这样将来有请求再次访问该页面时,就可以省去磁盘IO的开销了

3.缓存原则:

  • 1.“ 位置 * 频次 ”这个原则,可以帮我们对 I/O 访问效率进行优化。
  • 2.首先,位置决定效率,提供缓冲池就是为了在内存中可以直接访问数据。
  • 3.其次,频次决定优先级顺序。因为缓冲池的大小是有限的,比如磁盘有 200G,但是内存只有 16G,缓冲池大小只有 1G,就无法将所有数据都加载到缓冲池里,这时就涉及到优先级顺序,会 优先对使用频次高的热数据进行加载

4.缓冲池的预读特性:

  • 1.了解了缓冲池的作用之后,我们还需要了解缓冲池的另一个特性:预读
  • 2.缓冲池的作用就是提升IO效率,而我们进行读取数据的时候存在一个"“局部性原理”,也就是说我们使用了一些数据,大概率还会使用它周周的一些数据,因此采用“预读”的机制提前加载,可以减少未来可能的磁盘I/O操作

2.2.查询缓存

  • 1.查询缓存是提前把查询结果缓存 起来,这样下次不需要执行就可以直接拿到结果
  • 2.需要说明的是,在MySQL 中的查询缓存,不是缓存查询计划,而是查询对应的结果。因为命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低

3、缓冲池如何读取数据

  • 1.缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。
  • 2.缓存在数据库中的结构和作用如下图所示:
    在这里插入图片描述
  • 3.如果我们执行 SQL 语句的时候更新了缓存池中的数据,那么这些数据会马上同步到磁盘上吗?
    • 实际上,当我们对数据库中的记录进行修改的时候,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘上。
    • 注意并不是每次发生更新操作,都会立刻进行磁盘回写。
    • 缓冲池会采用一种叫做checkpoint 的机制将数据回写到磁盘上,这样做的好处就是提升了数据库的整体性能。
    • 比如,当缓冲池不够用时,需要释放掉一些不常用的页,此时就可以强行采用checkpoint的方式,将不常用的脏页回写到磁盘上,然后两从缓冲池中将这些页释放掉。这里脏页(dirty page)指的是缓冲池中被修改过的页,与磁盘上的数据页不一致

3、查看/设置缓冲池的大小

  • 1.如果你使用的是MySQL MyISAM存储引擎,它只缓存索引,不缓存数据,对应的键缓存参数为key_buffer_size,你可以用它进行查看。
  • 2.如果你使用的是 InnoDB 存储引擎,可以通过查看 innodb_buffer_pool_size 变量来查看缓冲池的大小。命令如下:
    show variables like 'innodb_buffer_pool_size';
    /*输出
    +-------------------------+-----------+
    | Variable_name           | Value     |
    +-------------------------+-----------+
    | innodb_buffer_pool_size | 134217728 |
    +-------------------------+-----------+
    */
    
  • 3.你能看到此时 InnoDB 的缓冲池大小只有 134217728/1024/1024=128MB。我们可以修改缓冲池大小,比如改为256MB,方法如下:set global innodb_buffer_pool_size = 268435456或者在配置文件中修改:innodb_buffer_pool_size = 268435456,然后再来看下修改后的缓冲池大小,此时已成功修改成了 256 MB

4、多个Buffer Pool实例

  • 1.Buffer Pool本质是InnoDB向操作系统申请的一块连续的内存空间,在多线程环境下,访问Buffer Pool中的数据都需要加锁处理。在Buffer Pool特别大而且多线程并发访问特别高的情况下,单一的Buffer Pool可能会影响请求的处理速度。所以在Buffer Pool特别大的时候,我们可以把它们拆分成若干个小的Buffer Pool,每个Buffer Pool都称为一个实例,它们都是独立的,独立的去中请内存空间,独立的管理各种链表。所以在多线程并发访问时并不会相互影响,从而提高并发处理能力

  • 2.可以在服务器启动的时候通过设置innodb_buffer_pool_instances的值来修改Buffer Pool实例的个数,修改其配置文件,添加这行:innodb_buffer_pool_instances = 2,这样就表明我们要创建2个 Buffer Pool 实例。

  • 3.我们看下如何查看缓冲池的个数,使用命令:

show variables like 'innodb_buffer_pool_instances';
/*默认有一个Buffer Pool实例
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1     |
+------------------------------+-------+
*/
  • 4.那每个 Buffer Pool 实例实际占多少内存空间呢?其实使用这个公式算出来的:innodb_buffer_pool_size/innodb_buffer_pool_instances,也就是:总共的大小除以实例的个数,结果就是每个 Buffer Pool 实例占用的大小
  • 5.也不是Buffer Pool实例创建的越多越好,分别管理各个Buffer Pool也是需要性能开销的,InnoDB规定:当innodb_buffer_pool_size的值小于1G的时候设置多个实例是无效的,InnoDB会默认把innodb_buffer_pool_instances 的值修改为1。而我们鼓励在Bufer Pool大于或等于1G的时候设置多个Buffer Pool实例

5、引申问题

Buffer Pool是MySQL内存结构中十分核心的一个组成,你可以先把它想象成一个黑盒子。

a.黑盒下的更新数据流程:

  • 1.当查询数据的时候,会先去Buffer Pool中查询。
  • 2.如果Buffer Pool中不存在,存储引擎会先将数据从磁盘加载到Buffer Pool中,然后将数据返回给客户端;
  • 3.同理,当更新某个数据的时候,如果这个数据不存在于BufferPool,同样会先将数据加载进来,然后修改内存的数据。被修改过的数据会在之后统一刷入磁盘
    在这里插入图片描述

b.问题分析:

  • 1.假设修改Buffer Pool中的数据成功,但是还没来得及将数据刷入磁盘MySQL就挂了怎么办?按照上图的逻辑,此时更新之后的数据只存在于Buffer Pool中,如果此时MySQL宕机了,这部分数据将会永久地丢失;
  • 2.如果数据更新到一半突然发生错误了,想要回滚到更新之前的版本,该怎么办?连数据持久化的保证、事务回滚都做不到还谈什么崩溃恢复?答案:Redo Log & Undo Log
    • Redo Log :解决刷盘时刷到一半宕机的问题
    • Undo Log:解决回滚的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑如何录屏?无水印、高清晰度电脑录屏教程

现如今,电脑录屏已成为我们工作、学习和娱乐中不可或缺的一部分,日常可以用来录制教学视频、游戏直播、会议记录等等,但有些朋友可能还不知道怎么高清录制视频,今天就给大家带来了几个简单又实用的方法,需要的朋友快码…

Jetpack02-LiveData 数据驱动UI更新(类似EventBus)

前提 LiveData使用了Lifecycle的生命周期,阅读本文前,请先了解Lifecycle源码。 简介 LiveData本质是数据类型,当改变数据的时候,会通知观察者,且只在界面可见的时候才会通知观察者。只能在主线程注册观察者&#xf…

CaLM 因果推理评测体系:如何让大模型更贴近人类认知水平?

CaLM 是什么 CaLM(Causal Evaluation of Language Models,以下简称“CaLM”)是上海人工智能实验室联合同济大学、上海交通大学、北京大学及商汤科技发布首个大模型因果推理开放评测体系及开放平台。首次从因果推理角度提出评估框架&#xff…

面试经典 150 题:力扣88. 合并两个有序数组

每周一道算法题启动 题目 【题目链接】 【解法一】合并后排序 排序后的数组自动省略0的数字&#xff0c;又学到了 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//合并两个数组后排序for(int i0; i<…

什么人需要远程访问?如何用节点小宝实现远程访问?

随着工作任务日益繁重&#xff0c;远程控制/远程访问成为越来越多人用来提高工作效率的一种方式。远程访问&#xff08;Remote access&#xff09;用来为远程办公人员、外出人员&#xff0c;以及管理多个部门办公室服务器的系统管理员提供远程网络连接。 如何开启远程访问&…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

C语言课程设计题目一:职工信息管理系统设计

文章目录 题目一&#xff1a;职工信息管理系统设计代码块employeeManagement.hemployeeManage.ctest.c 调试验证录入信息&#xff0c;并浏览验证职工号唯一保存职工信息&#xff0c;加载职工信息按职工号进行查询根据id删除职工修改职工信息 题目一&#xff1a;职工信息管理系统…

国家首次向全社会提供永久基本农田查询服务

自然资源部永久基本农田查询平台正式上线。 据悉&#xff0c;这是国家首次向全社会提供永久基本农田查询服务。 如何查询永久基本农田信息 永久基本农田查询平台正式上线&#xff0c;是对永久基本农田依法实施特殊保护的重要举措&#xff0c;是对各地已开展的永久基本农田公…

分割掩码标注转YOLO多边形标注

Ultralytics 团队付出了巨大的努力&#xff0c;使创建自定义 YOLO 模型变得非常容易。但是&#xff0c;处理大型数据集仍然很痛苦。训练 yolo 分割模型需要数据集具有其特定格式&#xff0c;这可能与你从大型数据集中获得的格式不完全相同。如果你想使用巨大的 OpenImagesV7 作…

MIPI包分析

如下图所示&#xff0c;长方形圈出来的是数据包的规定区域&#xff0c;注意SOT不在packet的定义区间。 分析可知&#xff0c;第一byte就知道包的类型&#xff0c;姑且记作VC2DT6。DT6就是6bits的data type。显而易见总共定义了64中类型&#xff0c;规范中定义了一些&#xff0…

【C++掌中宝】C++ 中的空指针救世主——nullptr

文章目录 1. 什么是 NULL&#xff1f;2. NULL 在 C 和 C 中的区别3. C11 引入 nullptr 的原因4. nullptr 与 NULL 的区别5. nullptr 的应用场景6. 模拟 nullptr 的实现7. 总结结语 1. 什么是 NULL&#xff1f; 在 C 和 C 编程中&#xff0c;NULL 常用于表示空指针&#xff0c;…

展示中国客车硬实力!苏州金龙海格纯电客车惊艳汉诺威商用车展

德国当地时间2024年9月22日&#xff0c;IAA汉诺威商用车展在德国汉诺威展览中心圆满落幕。本届展会&#xff0c;苏州金龙海格客车携新能源公交明星产品Azure7、斯堪尼亚海格高端巴士Fencer F1 Integral EV纯电车型重磅亮相&#xff0c;获得了众多参会嘉宾的好评和关注。来自欧洲…

【活动】人工智能时代,程序员如何保持核心竞争力?需要掌握哪些技能?

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;程序员面临着前所未有的挑战和机遇。AI不仅改变了软件开发的方式&#xff0c;也重新定义了程序员的角色。在这种背景下&#xff0c;如何保持…

人工智能助力阿尔茨海默症治疗:微软与上海精神卫生中心的新研究

最近&#xff0c;微软研究院与上海市精神卫生中心合作&#xff0c;基于微软 Azure OpenAI 服务中的多模态大模型&#xff0c;开发了一种名为“忆我”&#xff08;ReMe&#xff09;的个性化认知训练框架。这一创新项目旨在通过数字化手段扩展自动化认知训练的范围&#xff0c;为…

2025考研,报名和初试时间定了!

2025年全国硕士研究生招生初试时间为2024年12月21日至22日&#xff0c;考试时长为6小时的考试科目在12月23日举行。 请考生届时登录“中国研究生招生信息网”&#xff08;网址&#xff1a;https://yz.chsi.com.cn&#xff09;参加报名&#xff0c;查看报名须知、招生单位招生章…

软考高级:云计算架构的五层 AI 解读

云计算架构通常由多个层次构成&#xff0c;每个层次负责不同的功能&#xff0c;协同工作来提供完整的云服务。下面我将详细解释云计算架构的五个主要层次&#xff1a;管理层、用户访问层、应用层、平台层和资源层。 生活化例子 想象一下&#xff0c;云计算架构就像是一座大型…

从金蝶云星空到管易云通过接口配置打通数据

从金蝶云星空到管易云通过接口配置打通数据 接通系统&#xff1a;金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台。K/3Cloud支持…

yolov8环境安装

yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …

保姆级教程!0基础小白也适用,教你用AI美女在小红书“疯狂上分”

文章开始之前&#xff0c;先考考各位小伙伴的眼力&#xff1a;下面的图是真人还是 AI&#xff0c;你能分辨出来吗&#xff1f; 答案是&#xff1a;AI&#xff0c;AI&#xff0c;全是使用stable diffusion生成的AI美女&#xff01; 说实话&#xff0c;最近AI美女是彻底杀疯了&a…

大数据Hive组件安装

组件版本 组件版本Hadoop3.3.0JDK1.8.0_241Mysql5.7.25Hive3.1.2 Hadoop集群服务分布 Node1Node2Node3NameNode DataNode DataNodeDataNode NodeManager NodeManagerResourceManagerSecondaryNameNode 安装前请确定Hadoop集群服务全部启动&#xff0c;不然后续测试时会报…