当前位置: 首页 > news >正文

MySQL存储引擎-存储结构

Innodb存储结构

在这里插入图片描述

  1. Buffer Pool(缓冲池):BP以Page页为单位,页默认大小16K,BP的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。
    ○ Page根据状态可以分为三种类型:
    ■ free page : 空闲page,未被使用。
    ■ clean page:被使用page,数据没有被修改过。
    ■ dirty page:脏页,被使用page,数据被修改过。
    ○ 针对上述三种page类型,InnoDB通过三种链表结构来维护和管理
    ■ free list :表示空闲缓冲区,管理free page
    ■ flush list:表示需要刷新到磁盘的缓冲区,管理dirty page,内部page按修改时间排序。脏页即存在于flush链表,也在LRU链表中,但是两种互不影响,LRU链表负责管理page的可用性和释放,而flush链表负责管理脏页的刷盘操作。
    ■ lru list:表示正在使用的缓冲区,管理clean page和dirty page,缓冲区以midpoint为基点,前面链表称为new列表区,存放经常访问的数据,占63%;后面的链表称为old列表区,存放使用较少数据,占37%。
    ○ 改进型LRU算法维护
    ■ 普通LRU:末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰
    ■ 改性LRU:链表分为new和old两个部分,加入元素时并不是从表头插入,而是从中间midpoint位置插入,如果数据很快被访问,那么page就会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰。每当有新的page数据读取到buffer pool时,InnoDb引擎会判断是否有空闲页,是否足够,如果有就将free page从free list列表删除,放入到LRU列表中。没有空闲页,就会根据LRU算法淘汰LRU链表默认的页,将内存空间释放分配给新的页。(解决预度失效和Buffer Pool污染问题)
    Buffffer Pool配置参数 (8.0版本)
    show variables like ‘%innodb_page_size%’; //查看page页大小
    page_size 16384B/1024=16KB
    show variables like ‘%innodb_old%’; //查看lru list中old列表参数
    old

    1. innodb_old_blocks_pct:这个变量表示InnoDB缓冲池中被认为是“旧”的块的百分比。 InnoDB使用这个百分比来决定哪些块应该被认为是“旧”的,这些块可能适合被替换出缓冲池。默认值是37%,意味着如果一个块在缓冲池中存在的时间超过所有块的37%,它就被认为是旧的。这个值可以通过调整来优化缓冲池中数据的替换策略,以适应不同的工作负载。
    2. innodb_old_blocks_time:这个变量定义了一个块在被标记为“旧”之前必须在缓冲池中停留的最小时间(以毫秒为单位)。默认值是1000毫秒(1秒)。如果一个块在缓冲池中停留的时间少于这个值,即使它的使用频率很低,它也不会被标记为旧块。这个设置可以帮助控制哪些页应该被优先替换出缓冲池。

    show variables like ‘%innodb_buffer%’; //查看buffffer pool参数
    buffer

  2. Change Buffer(写缓冲区):在进行DML操作时,如果BP没有其相应的Page数据, 并不会立刻将磁盘页加载到缓冲池,而是在CB记录缓冲变更,等未来数据被读取时,再将数据合并恢复到BP中。 ChangeBuffffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写业务量来进行调整。参数innodb_change_buffer_max_size; size
    当更新一条记录时,该记录在BufferPool存在,直接在BufferPool修改,一次内存操作。如果该记录在BufferPool不存在(没有命中),会直接在ChangeBuffer进行一次内存操作,不用再去磁盘查询数据,避免一次磁盘IO。当下次查询记录时,会先进性磁盘读取,然后再从 ChangeBuffer中读取信息合并,最终载入BufferPool中。
    写缓冲区,仅适用于非唯一普通索引页,为什么?
    如果在索引设置唯一性,在进行修改时,InnoDB必须要做唯一性校验,因此必须查询磁盘,做一次IO操作。会直接将记录查询到BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作。

  3. Adaptive Hash Index:自适应哈希索引,用于优化对BP数据的查询。InnoDB存储引擎会监控对表索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应。InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。

  4. Log Buffer:日志缓冲区,用来保存要写入磁盘上log文件的数据,日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB 或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O。 LogBuffer主要是用于记录InnoDB引擎日志,在DML操作时会产生Redo和Undo日志。 LogBuffer空间满了,会自动写入磁盘。可以通过将innodb_log_buffer_size参数调大,减少磁盘IO频率 。

InnoDB磁盘主要包含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffffer、Redo Log
和Undo Logs。

  1. 表空间(Tablespaces):用于存储表结构和数据。表空间又分为系统表空间、独立表空间、 通用表空间、临时表空间、Undo表空间等多种类型;
    ○ 系统表空间(The System Tablespace)
    包含InnoDB数据字典,Doublewrite Buffer,Change Buffer,Undo Logs的存储区
    域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。系统表空
    间是一个共享的表空间因为它是被多个表共享的。该空间的数据文件通过参数
    innodb_data_file_path控制。
    系统表空间
    ○ 独立表空间(File-Per-Table Tablespaces)
    默认开启,独立表空间是一个单表表空间,该表创建于自己的数据文件中,而非创建于
    系统表空间中。当innodb_file_per_table选项开启时,表将被创建于表空间中。否则,
    innodb将被创建于系统表空间中。每个表文件表空间由一个.ibd数据文件代表,该文件
    默认被创建于数据库目录中。表空间的表文件支持动态(dynamic)和压缩
    (commpressed)行格式。
    ○ 通用表空间(General Tablespaces)
    通用表空间为通过create tablespace语法创建的共享表空间。通用表空间可以创建于
    mysql数据目录外的其他表空间,其可以容纳多张表,且其支持所有的行格式。
    ○ 撤销表空间(Undo Tablespaces)
    撤销表空间由一个或多个包含Undo日志文件组成。在MySQL 5.7版本之前Undo占用的
    是System Tablespace共享区,从5.7开始将Undo从System Tablespace分离了出来。
    InnoDB使用的undo表空间由innodb_undo_tablespaces配置选项控制,默认为0。参
    数值为0表示使用系统表空间ibdata1;大于0表示使用undo表空间undo_001、
    undo_002等。
    ○ 临时表空间(Temporary Tablespaces)
    临时表空间分为session temporary tablespaces 和global temporary tablespace两种。session
    temporary tablespaces 存储的是用户创建的临时表和磁盘内部的临时表。global
    temporary tablespace储存用户临时表的回滚段(rollback segments )。mysql服务
    器正常关闭或异常终止时,临时表空间将被移除,每次启动时会被重新创建。
  2. 数据字典(InnoDB Data Dictionary)
    InnoDB数据字典由内部系统表组成,这些表包含用于查找表、索引和表字段等对象的元数
    据。元数据物理上位于InnoDB系统表空间中。由于历史原因,数据字典元数据在一定程度上
    与InnoDB表元数据文件(.frm文件)中存储的信息重叠。
  3. 双写缓冲区(Doublewrite Buffer)
    位于系统表空间,是一个存储区域。在BufferPool的page页刷新到磁盘真正的位置前,会先
    将数据存在Doublewrite 缓冲区。如果在page页写入过程中出现操作系统、存储子系统或
    mysqld进程崩溃,InnoDB可以在崩溃恢复期间从Doublewrite 缓冲区中找到页面的一个好
    备份。在大多数情况下,默认情况下启用双写缓冲区,要禁用Doublewrite 缓冲区,可以将
    innodb_doublewrite设置为0。

    使用Doublewrite 缓冲区时建议将innodb_flush_method设 置为O_DIRECT。
    在这里插入图片描述
    MySQL的innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、 刷写模式。有三个值:fsync(默认),O_DSYNC,O_DIRECT。设置O_DIRECT表示数据文件写入操作会通知操作系。不要缓存数据,也不要用预读,直接从Innodb Buffer写到磁盘文件。 默认的fsync意思是先写入操作系统缓存,然后再调用fsync()函数去异步刷数据文件与redo log的缓存信息。
  4. 重做日志(Redo Log)
    重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间更正不完整事务写入的数据。
    MySQL以循环方式写入重做日志文件,记录InnoDB中所有对Buffer Pool修改的日志。当出
    现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数
    据更新到数据文件。读写事务在执行的过程中,都会不断的产生redo log。默认情况下,重
    做日志在磁盘上由两个名为ib_logfifile0和ib_logfifile1的文件物理表示。
  5. 撤销日志(Undo Logs)
    撤消日志是在事务开始之前保存的被修改数据的备份,用于例外情况时回滚事务。撤消日志
    属于逻辑日志,根据每行记录进行记录。撤消日志存在于系统表空间、撤消表空间和临时表
    空间中。

MySQL 8.0 版本 的存储引擎

在这里插入图片描述
● 将InnoDB表的数据字典,双写缓冲区和Undo都从共享表空间ibdata中彻底分离出来了,以前需要ibdata中数据字典与独立表空间ibd文件中数据字典一致才行,8.0版本就不需要了。
● temporary 临时表空间也可以配置多个物理文件,而且均为 InnoDB 存储引擎并能创建索引,这样加快了处理的速度。
● 用户可以像 Oracle 数据库那样设置一些表空间,每个表空间对应多个物理文件,每个表空间可以给多个表使用,但一个表只能存储在一个表空间中。

相关文章:

MySQL存储引擎-存储结构

Innodb存储结构 Buffer Pool(缓冲池):BP以Page页为单位,页默认大小16K,BP的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。 ○ Page根据状态可以分…...

理解torch函数bmm

基本信息 功能描述 torch.bmm 是 PyTorch 中的一个函数,用于执行批量矩阵乘法(Batch Matrix Multiplication)。它适用于处理一批矩阵的乘法操作,特别适合于深度学习任务中的场景,比如卷积神经网络中的某些层。 参数…...

2024 年的科技趋势

2024 年在科技领域有着诸多重大进展与突破。从人工智能、量子计算到基因组医学、可再生能源以及新兴技术重塑了众多行业。随着元宇宙等趋势的兴起以及太空探索取得的进步,未来在接下来的岁月里有望继续取得进展与突破。让我们来探讨一下定义 2024 年的一些关键趋势&…...

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件(1)新建虚拟机(2)设置虚拟机(3)打开虚拟机 windows server 2012(4)进…...

leetcode45.跳跃游戏II

标签:动态规划 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:返回到达 nums[n - 1] 的最小跳跃次数。…...

边缘智能创新应用大赛获奖作品系列三:边缘智能强力驱动,机器人天团花式整活赋能千行百业

边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…...

基于语义的NLP任务去重:大语言模型应用与实践

引言 在自然语言处理(NLP)任务中,数据质量是模型性能的关键因素之一。重复或冗余的数据会导致模型过度拟合或浪费计算资源,特别是在大语言模型(如 BERT、GPT 系列等)训练和推理阶段。传统的基于字符匹配的…...

使用阿里云Certbot-DNS-Aliyun插件自动获取并更新免费SSL泛域名(通配符)证书

进入nginx docker,一般是Alpine Linux系统 1. 依次执行命令: sudo docker-compose exec nginx bashapk updateapk add certbot apk add --no-cache python3 python3-dev build-baseapk add python3 py3-pippip3 install --upgrade pippip3 install certbot-dns-ali…...

Node.js安装配置+Vue环境配置+创建一个VUE项目

目录 安装Node.js搭建VUE环境 安装Node.js 下载 测试是否安装成功 在目录下新建两个文件夹 管理员打开cmd npm config set prefix "D:\Software\nodejs\node_global" npm config set cache "D:\Software\nodejs\node_cache"将默认的 C 盘下【 AppData\…...

“TA”说|表数据备份还原:SQLark 百灵连接助力项目部署验收

💬 南飞雁|应用开发工程师 有些重要项目的部署验收,会在生产环境完成,验收完成后,又需要把这部分数据清空。这时就需要对数据表进行备份和还原,虽然可以通过命令直接实现,但是有一些操作门槛&am…...

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…...

Spring Boot 集成 MyBatis 全面讲解

Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架,与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis,包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …...

C语言小练习-打印字母倒三角

编写一个程序&#xff0c;在用户输入某个大写字母后&#xff0c;产生一个金字塔图案。 #include <stdio.h>int main(int argc,char *argv[]) {char ch; loop:printf("请输入大写字母&#xff01;\n");scanf("%c",&ch);getchar();if(ch < A ||…...

Linux -- 线程控制相关的函数

目录 pthread_create -- 创建线程 参数 返回值 代码 -- 不传 args&#xff1a; 编译时带 -lpthread 运行结果 为什么输出混杂&#xff1f; 如何证明两个线程属于同一个进程&#xff1f; 如何证明是两个执行流&#xff1f; 什么是LWP&#xff1f; 代码 -- 传 args&a…...

基于quasar,只选择年度与月份的组件

为什么要做 quasar是个基于vue的强大的UI开发库&#xff0c;它提供了非常多的组件&#xff0c;比如日期选择。但是有些时候只需要选择到月份就可以了&#xff0c;quasar中没有&#xff0c;所以自己动手写了一个。因为对界面编程我不熟悉&#xff0c;所以&#xff0c;如果你有更…...

健康养生:拥抱生活的艺术

健康养生&#xff1a;拥抱生活的艺术 在快节奏的现代生活中&#xff0c;健康已成为我们最宝贵的财富。健康养生&#xff0c;不仅仅是一种生活方式的选择&#xff0c;更是一种对待生活的态度&#xff0c;它关乎于如何在日常中寻找到平衡&#xff0c;让身心得以滋养&#xff0c;…...

注意力机制+时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测

注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;LSTM-Attention-Adaboost多变量时序预测 目录 注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;LSTM-Attention-Adaboost多变量时序预测效果一览基本介绍程序设计参考资料 效果一览 基…...

uniapp 微信小程序 均分数据展示

效果图 数据展示&#xff0c;可自行搭配 html <view class"num-wrapper"><view class"num-item" click.stop"routerGo(跳转的地址)"><text class"num">&#xffe5;{{ 要展示的数据 || 0}}</text><view…...

Nacos 3.0 考虑升级到 Spring Boot 3 + JDK 17 了!

Nacos 由阿里开源&#xff0c;是 Spring Cloud Alibaba 中的一个重要组件&#xff0c;主要用于发现、配置和管理微服务。 由于 Spring Boot 2 的维护已于近期停止&#xff0c;Nacos 团队考虑升级到 Spring Boot 3 JDK 17&#xff0c;目前正在征求意见和建议。 这其实是一件好…...

跟沐神学读论文-论文阅读管理

摘要 近期有读论文的需求&#xff0c;就需要去了解一下论文到底要怎么读&#xff0c;同一个系列之间的论文如何作整理和归纳&#xff0c;之前也有了解过市面上有成熟的论文阅读工具&#xff0c;但是对于学生党来讲没什么性价比&#xff0c;在B站上看到沐神有讲解他的思路Typor…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…...