MySQL innodb引擎架构分析-Buffer Pool

news2025/7/8 6:07:52

文章目录

  • 系列文章目录
  • 前言
  • 一、Buffer Pool是什么?
  • 二、Buffer Pool是如何工作的?
    • 1. free链
    • 2. flush链
      • 根据脏页的情况(阈值)和相关配置刷新
      • 自适应刷脏
    • 3. Lru升级链
  • 总结
      • 参数:innodb_buffer_pool_size
      • 参数:innodb_buffer_pool_instances
      • 参数:innodb_change_buffer_max_size

系列文章目录

1. MySQL innodb引擎架构分析-Buffer Pool


前言

InnoDB是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一,它是事务型数据库的首选引擎,支持ACID事务,支持行级锁定。InnoDB是为处理巨大数据量时的最大性能设计。InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池,这个缓冲池就是Buffer Pool。


一、Buffer Pool是什么?

在这里插入图片描述

Buffer Pool是以页为单位的MySQL数据缓冲池,其工作原理类似Java的新生代、老年代(&元空间),它能降低磁盘访问的次数以提高数据库的性能。Buffer Pool的默认大小是128M。在实际的生产环境中可以通过参数innodb_buffer_pool_size对 Buffer pool进行调整。

二、Buffer Pool是如何工作的?

当我们在数据库select数据时,如果每次都去磁盘读取,那效率无疑是大打折扣,同理,如果每次update也都是去磁盘更新,那效率也是很低的,为了降低数据库操作时频繁的操作磁盘,Buffer Pool应运而生,在第一次磁盘读出数据是如何知道Buffer Pool空间哪里是空闲的呢?在更新时更新了Buffer Pool中的数据,是怎么知道哪些页的是“脏数据”(没有持久化到磁盘的数据),在Buffer Pool空间已满,下次来的数据怎么放呢?为了解决这种问题,Buffer Pool有3种数据链表设计:free链,flush链,Lru升级链。

1. free链

free链能帮助MySQL找到空闲的缓存页,它是一个双向链表,链表上除了描述信息块,还有一个基础节点,存储了free链有多少个描述信息块,也就是有多少个空闲的缓存页,链表节点是空闲的缓存页对应的描述信息块,当数据库加载数据的时候,会从free链中找到空闲的缓存页,加载数据到缓存页后,会把缓存页对应的描述信息块从free链表中移除

2. flush链

flush链帮MySQL找到脏缓存页,也就是需要持久化的缓存页,如果更新了缓存页,会把该缓存页加入到flush链表中,它也有一个基础结点,并存储了有多少个描述信息块,可以通过阈值和自适应刷脏来处理脏数据页的磁盘持久化;

根据脏页的情况(阈值)和相关配置刷新

清理脏数据后台线程的个数:

SHOW VARIABLES LIKE 'innodb_page_cleaners';

脏页的最低水位,默认为0,非0时表示开启脏页预刷,当脏页达到innodb_max_dirty_pages_pct_lwm时刷脏页就开始了

SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct_lwm';

innodb_max_dirty_pages_pct控制脏页在BufferPool中的百分比,默认是75%,innodb就会强制刷脏页

SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';(Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total)

查看脏页数量

select * from performance_schema.global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';

查看页总数

select * from performance_schema.global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';

刷一个脏page时,是否刷这个page的整个extent(简单理解就是若干个物理连续的page组成一个extent,为了更好的IO)。0表示关闭该功能,1表示刷extent中连续的page,2表示刷整个extent中的page。当数据在普通盘上,开启该功能可以减少IO次数,当数据在ssd上,IO情况较好,可以考虑关闭该功能,刷整个extent会比刷一个page更慢,所以mysql8.0中innodb_flush_neighbors的默认值为0

SHOW VARIABLES LIKE 'innodb_flush_neighbors';

自适应刷脏

在一般的业务压力下,采用阈值没有问题. 但是对于用户业务不确定的场景, 简单的采用阈值的方式容易造成在用户业务压力大的情况下数据库的剧烈抖动。所以采用自适应的刷脏策略,尽可能在所有的用户场景达到系统平滑运行。
首先需要开启,是否打开自适应刷脏:

SHOW VARIABLES LIKE 'innodb_adaptive_flushing';

根据redo log产生的速度,参考当前刷脏的平均数量和设置的系统IO参数(innodb_io_capacity, innodb_io_capacity_max) 三者的平均值生成一个合理的建议刷脏的Page数量;

3. Lru升级链

如果MySQL数据库使用普通的Lru策略来进行缓存页的淘汰,那在我们查询大量数据时可能导致把缓冲池的所有页都替换出去,导致大量热数据被换出,MySQL性能急剧下降,为了应对这种问题,MySQL采用了冷热2段机制,比例为5:3,空间的5分是热数据,3分是冷数据,在MySQL设置的时间内(1秒)重复读取的页不会作为热数据移到热数据区的头部,这样解决了当读取大量数据时新的数据会覆盖热数据的问题。只有符合设定的条件读取的数据才会放到热数据区的头部,如果要覆盖缓冲,直接覆盖冷数据区的最后一个即可。


总结

BufferPool是InnoDB独有的,用于提升性能,不管读写操作都可以,同时我们可以灵活配置相关参数(innodb_buffer_pool_size、innodb_buffer_pool_instances、innodb_change_buffer_max_size)优化mysql;

参数:innodb_buffer_pool_size

配置缓冲池的大小,在内存允许的情况下,DBA往往会建议调大这个参数,越多数据和索引放到内存里,数据库的性能会越好。

参数:innodb_buffer_pool_instances

innodb_buffer_pool_instances 参数,将 buffer pool 分成几个区,每个区用独立的锁保护,这样就减少了访问 buffer pool 时需要上锁的粒度,以提高性能。参数设置是个平衡问题,innodb_buffer_pool_instances 设置太小,锁冲突集中;设置太大,维护成本升高。

参数:innodb_change_buffer_max_size

允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认情况下设置为25。最大可设置为50。

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

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

相关文章

避免重要数据泄露的8种方式

得益于国家的大力支持,我国数字化经济已开启高速发展模式,数据已经成为企业不可或缺的重要资产,相对应的数据安全风险问题也随之而来。 数据泄露不仅给企业带来了财产损失,也给企业带来了极大的声誉威胁。以下是日常生活中企业和…

W公司对接奥迪Audi EDI项目案例

项目背景 奥迪(Audi)是德国大众汽车集团子公司奥迪汽车公司旗下的豪华汽车品牌,作为高技术水平、质量标准、创新能力、以及经典车型款式的代表,奥迪是汽车品牌之一。公司总部设在德国的英戈尔施塔特,并在中国等许多国…

ASA防火墙高级配置——NAT控制欲NAT豁免

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.NAT控制欲NAT豁免 1.禁用NAT控制 1)出站(Outbou…

2021全国高校计算机能力挑战赛(初赛java)(部分)

数据1 input: 4 L G D U 7 L Y C N 2 T G E N 1 T R E P 4 output: 1 1 数据2 input: 6 L G D E 7 L Y C N 4 T G E N 4 T Y E P 3 L Y C N 2 T G D N 3 output: 1 1 package com.第四届校内模拟;import java.util.Scanner;/*** Author Lunau* Create 2022-12-09 18:02* Descri…

使用 ESP-DL 深度学习库基于 ESP32-S3 实现手势识别

人工智能改变了计算机与现实世界交互的方式。过去,人们通过微小的低功率设备和传感器获取数据,并传输至云端进行决策。这样的方式在设备连接性、成本和数据隐私方面带来了一定挑战。相对地,边缘人工智能是在物理设备上另一种处理数据的方式&a…

11.javase_面向对象1

一.面向对象介绍 1.1并不是一个技术,而是一种编程指导思想 1.2以什么形式组织代码;以什么思路解决问题 1.3为什么要用面向对象编程: 因为生活中,我们解决问题时,就是采用这种指导思想去解决的。 所以,我们写…

Codeforces Round #792 (Div. 1 + Div. 2)

比赛链接:Dashboard - Codeforces Round #792 (Div. 1 Div. 2) - Codeforces A: 思维 题意:Alice和Bob在玩游戏,每次等Alice交换两个不同位置的数后,Bob就会删除最后一个位置上的数,当最终只剩下一个数后&#xff0c…

基于对抗互信息学习特征解耦的零样本语音转换|INTERSPEECH 2022

零样本语音转换在转换时只需目标说话人的一段语音,更适合实际应用需求,具有广泛应用前景。 现有工作只考虑内容和音色表征的解耦,没有考虑与语音旋律相关的 韵律 和 音高 表征,导致与音高和韵律相关的信息泄露到音色中。 本文利用…

Flutter - Stack 与 Positioned 层叠布局

1 层叠布局和 Web 中的绝对定位、Android 中的 Frame 布局是相似的 2 子组件可以根据距父容器四个角的位置来确定自身的位置。 3 层叠布局允许子组件按照代码中声明的顺序堆叠起来。 4 Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。 5 Stack允许子组件堆叠&am…

什么是数据为先营销?为什么它对市场部如此重要?

数据为先营销希望能帮助各地的市场人员与高管们建立联系,实现这些商业目标,并真正学会如何适当地跟踪一切数据,这样他们就知道自己是否真的达到了收入目标,ROI,这些商业目标,而不是仅仅说我们是被数据驱动型…

先进的数字隔离技术提高了太阳能逆变器的可靠性

介绍 一个多世纪以来,化石燃料发电设施一直被证明是坚固可靠的能源,但这些久经考验的电力设施规模大、复杂,而且建造成本越来越高。以最小的碳足迹和环境影响清洁地操作它们也具有挑战性和成本高昂。相比之下,现代光伏&#xff0…

CSDN涨粉就这几招

目录说明涨粉不可不知的几件事几个常规的涨粉之道CSDN的数据运营之道粉丝列表关注列表关注某人取消关注获得某个用户的主要信息:昵称、排名、原创数、粉丝数等其它数据有了数据,怎么涨粉?说明 直到今年,我才开始重视涨粉&#xf…

_2LeetCode代码随想录算法训练营第二天C++

_2LeetCode代码随想录算法训练营第二天C LeetCode 题目列表: 977.有序数组的平方209.长度最小的子数组59.螺旋矩阵II 977.有序数组的平方 题目所述数组含有负数。 双指针的思路 双指针的思路: 最大元素一定是在两边,考虑用两个指针逐步…

PHY寄存器解读

以太网PHY寄存器分析 1 1、以太网PHY标准寄存器分析 2 1.1 Control Register 2 1.2 Status register 5 1.3 PHY Identifier Register 8 1.4 Auto-Negotiation Advertisement Register 8 1.5 Auto-Negotiation Link Partner Base Page Ability Register…

NY CREATE和Bleximo宣布达成新量子计算研发合作

(图片来源:网络) 12月7日,全栈量子计算系统集成公司Bleximo Corp.宣布:计划将其原型设计和营销业务扩展到纽约北部的奥尔巴尼纳米技术综合体(Albany NanoTech Complex)。该公司还将与纽约研究、经济发展、技术、工程和…

llvm编译、自带例子toy、llvm编译报错解决、.lib中搜索指定函数名

hunterzju/llvm-tutorial cs.cmu.edu/academic/class/15745-s14/public/lectures 编译llvm cd /d d:\llvm-home\ git clone gitgitcode.net:pubz/llvm-project.gitcd /d d:\llvm-home\llvm-project\ git status #HEAD detached at llvmorg-11.0.0set PATH%PATH%;D:\Python38\S…

ImmunoChemistry丨艾美捷NIR-FLIVO 690游离染料对照试验说明书

ImmunoChemistry艾美捷ICT近红外(NIR)-FLIVO示踪剂与无NIR-FLIVO染料对照分析结合使用。无NIR-FLIVO染料控制试验使用无NIR-FRIVO染料检测试剂(*Dylight690游离染料)。注射时,游离染料对照物和示踪物试剂都会产生荧光信…

Java集合 超详细版+面试题

程序总是根据运行时才知道的某些条件去创建新的对象。在此之前,无法知道所需对象的数量甚至确切类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。下面讲详细介绍如何使用标准库中的集合类。 集合框架图 简化图&#xff…

遗传算法求解问题(1)

问题描述 在一个长度为 n 的数组中选择 10 个元素&#xff0c;使得 10个元素的和 与 该元组中元素总和的 1/10 接近 问题约束 数组长度 n&#xff1a;10 < n < 100; 数组中没有重复的数字&#xff0c;所以选择的10个元素中也没有重复的数字 遗传算法原理 请移步我上…

国产第一颗7A的车规级马达驱动芯片TMI8140-Q1

新能源汽车因其电动化和智能化的特性&#xff0c;需要大量的马达驱动、DC/DC、高效率Buck & BuckBoost等车规级芯片&#xff0c;成为名副其实的“芯片大户”&#xff01; 以往制造一辆传统汽车一般需要用到500-600颗左右的芯片&#xff0c;而一台高性能的新能源汽车需要芯…