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

【MySQL】InnoDB引擎

逻辑结构

InnoDB存储引擎逻辑结构如图所示:

Tablespace:表空间,一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间,用来存放表记录、索引等数据。

Segment:段,表空间中有多个段,而每个段中将表空间中的记录、索引等数据分为数据段、索引段、回滚段来存储。其中索引段就存储在B+树的非叶子结点,数据段就存储在叶子结点上。段中又管理多个区(Extent)。

Extent:区,表的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎的页大小为16k,那么每个区中就存储64个连续的页。

Page:页,是InnoDB存储引擎管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB每次从磁盘申请4~5个区。页中存放的就是表空间的记录和索引。

Row:行,在InnoDB引擎中数据是按行进行存放的。

Trx id 和Roll pointer是表结构中隐藏的两个字段。

Trx id :事务id,是用来存储最后一个操作的事务id。

Roll pointer:回滚指针,指向上一个版本记录在undo log的位置。多个版本被Roll pointer连接成一个版本链。这也是MVCC的原理。

InnoDB架构

MySQL5.5版本之后,默认的存储引擎是InnoDB,InnoDB的架构图如下:

内存结构

内存结构如图:

Buffer Pool:缓冲池,是主内存的一个区域,用来缓存磁盘上记录操作频繁的实时数据。在进行增删改查操作时,先查询缓冲池中是否有数据,如果没有,则需要从磁盘中加载到缓冲池,再进行对应的操作。然后将这些脏页以一定的频率刷新到磁盘当中。

缓冲池以Page为单位,底层采用链表来管理数据的。根据状态,将缓冲池中的Page分为三种:

free page :空闲页,该页中没有存放任何数据。

clean page :被使用的页,其中存放的数据是从磁盘加载过来的,并未被修改。

dirty page :脏页,该页中的数据被修改,即该页中的数据是最新的,和磁盘中的内容是不一致的。

Change Buffer:更改缓冲区,在执行DML语句时,如果Buffer Pool中没有对应的数据页,那么就将数据变更存储在Change Buffer中。之后读取这些数据时,会将磁盘中的数据与Change Buffer中的变更记录合并加载到Buffer Pool中。

Changer Buffer有什么意义?

Change Buffer是针对非唯一的二级索引。二级索引是随机的,如果多个修改操作直接通过磁盘IO操作,由于其随机性就会造成大量的磁盘IO,性能就会大打折扣。使用Change Buffer不会进行随机磁盘IO,从而减少了损耗。

Adaptive Hash Index:自适应哈希索引,用于优化Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,就会自动建立索引。

自适应哈希索引无需人工干预,由_MySQL自动执行。

可以通过 adaptive_hash_index参数进行控制,默认为ON,代表是开启的。

Log Buffer:日志缓冲区,用来保存要写入磁盘中的log日志数据(redo log、undo log),默认大小为16MB,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除多行的事务,增加日志缓冲区的大小可以节省磁盘IO。

参数:innodb_log_buffer_size:缓冲区大小

Innodb_flush_log_at_trx_commit:日志刷新到磁盘时机。

磁盘结构

磁盘结构如图:

System Tablespace:系统表空间,是更改缓冲区的存储区域。如果系统中独立表空间以及通用表空间关闭的话,系统表空间也会存储表的记录以及索引。

参数:innodb_data_file_path

File-Per-Table Tablespaces:每个表的独立表空间。默认是开启的。

参数:innodb_file_per_table

General Tablespaces:通用表空间,需要手动进行创建。在创建表时,可以为其指定表空间。

创建表空间语法:

CREATE TABLESPACE XXXX ADDDATAFILE 'file_name'ENGINGE = engine_name;

指定表空间语法:

CREATE TABLE XXX (...)TABLESPACE ts_name;

Undo Tablespaces:撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16MB),用于存储undo log日志。

Temporary Tablespaces:临时表空间,存储用户创建的临时表。

Doublewrite Buffer Files:双写缓冲区,innoDB引擎将数据页刷新到磁盘时,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。

Redo Log:重做日志,用来实现事务的持久性。

后台线程

InnoDB存储引擎涉及到很多内存与磁盘之间的操作,比如从脏页的刷新、磁盘文件的加载、日志的刷新等,这些操作都是由后台线程完成的。

1.Master Thread:核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘当中,保持数据一致性,还包括脏页的刷新、合并插入缓存、undo页的回收。

2.IO Thread:在InnoDB存储引擎中大量使用了AIO来处理请求,这样可以极大地提高数据库的性能,而IO Thread主要负责这些IO请求的回调。

线程类型默认个数职责
Read thread4负责读操作
Write thread4负责写操作
Log thread1负责将日志缓冲区刷新到磁盘
Insert buffer thread1负责将写缓冲区内容刷新到磁盘

3.Purge Thread:主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收。

4.Page Cleaner Thread:协助Master Thread刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞。

相关文章:

【MySQL】InnoDB引擎

逻辑结构 InnoDB存储引擎逻辑结构如图所示: Tablespace:表空间,一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间,用来存放表记录、索引等数据。 Segment:段,表空间中有多个段&#xff0c…...

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅 无需担忧,以下为你精心挑选的六大线上兼职方式,将助你轻松开启副业赚钱之旅。 1,参与网络调查:市场调研公司及品牌商为洞察消费者需求,常…...

富格林:出金不顺谨防虚假受害

富格林悉知,做投资有盈有亏是正常的,投资者需要做的是尽可能降低亏损的风险,警惕虚假出金陷阱,避免造成不必要的亏损。在进入黄金投资市场之前,投资者需学习一定的投资技巧,并且需要采取正规的策略来打击和…...

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好,我是咸鱼。 今天分享一个在压测过程中遇到的问题,当时排查这个问题费了我们好大的劲,所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候,测试和开发的同事反映压测有问题,请求打到…...

Appium Inspector 展示设备当前页面

定位元素需要使用appium inspector,之前每次都是从登录页开始,后来发现连接设备的时候只需要去掉appPackage、appActivity即可。 { "platformName": "Android", "platformVersion": "6", "deviceNa…...

PyQt:实现菜单栏的点击拖动效果

一、整体步骤 1.设计UI文件 2.调用显示 3.效果展示 二、设计UI文件 1.添加 Scroll Area控件,作为菜单栏的布置区域 2.设置 Scroll Area控件的属性 3.Scroll Area控件内放置 按钮控件 组成菜单栏 此处,放置了需要了6个按钮,并设置按钮的固…...

力扣--并查集547.省份数量

思路分析: 首先定义变量 fa 用于记录并查集,以及城市数量 n。定义了并查集的两个函数,find 用于查找节点的根节点,togother 用于合并两个节点所在的集合。在公共函数 findCircleNum 中,初始化并查集,然后遍…...

leetcode35-Search Insert Position

排序数组搜索某个元素,这种思维一定要往二分法上靠 public class searchInsertPosition{public static void main(String[] args) {int arr[] {1,3,5,6};System.out.println(getIndex(arr,2));}public static int getIndex(int[] arr,int target) {int start 0;i…...

API 接口渗透测试

1 API 接口介绍 1.1 RPC(远程过程调用) 远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无…...

oracle 19c单机版本补丁升级

文章目录 一、补丁包概述二、备份opatch三、替换高版本opatch四、打DB补丁1、关闭数据库2、关闭监听3、解压补丁4、冲突检测5、补丁空间检查6、执行补丁升级7、将更新内容加载到数据库8、最后查看数据库版本9、卸载补丁包 一、补丁包概述 补丁升级包 链接:https://…...

推荐系统的未来:大模型驱动的个性化推荐技术与挑战

推荐系统的未来:大模型驱动的个性化推荐技术与挑战 1. 背景介绍 推荐系统是现代互联网服务中不可或缺的一部分,它通过分析用户的历史行为和偏好,为用户提供个性化的内容推荐,从而提高用户体验和满意度。随着大数据、机器学习和人…...

Allegro许可管理工具

在数字化时代,软件许可管理成为企业面临的挑战之一。如何确保软件的合规使用、优化资源配置并降低运营成本是企业关注的焦点。Allegro许可管理工具作为一款强大的管理工具,为企业提供了全面、高效的解决方案。本文将深入探讨Allegro许可管理工具的卓越实…...

React函数组件Hook

问题: 相对于类组件, 函数组件的编码更简单, 效率也更高, 但函数组件不能有state (旧版) 解决: React 16.8版本设计了一套新的语法来让函数组件也可以有state Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 Hook也叫钩子…...

【FinalShell】远程连接 Linux 工具 FinalShell 的使用:查看 AI 语言大模型对话实时日志

一、查看 APP 实时 AI 问答消息的 websocket 类型日志 (1)Linux 模板命令配置 Linux 命令:查看 AI 语言大模型结合向量数据库的实时问答消息日志 ① 测试环境 FinalShell 命令模板 【Linux 命令标题】[Test_APP] today tail:webs…...

ARM Coresight 系列文章 11.1 -- CoreSight Cortex-M33 CTI 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 CTI 的工作原理CTI 主要特点CTI的使用场景CTI 的工作原理 CTI 允许不同的调试和追踪组件之间基于特定事件进行交互。例如,当一个断点被命中时,CTI 可以用来触发内存的追踪捕捉或者外部仪器的行为,反之亦然。这种…...

Linux常用操作命令(清单快查版)

Linux常用操作命令,今日先给出快查清单,后续出带命令参数及不同OS的区别语法的相关示例 1. 文件与目录操作 命令描述ls列出目录内容cd切换目录pwd显示当前工作目录mkdir创建目录rmdir删除空目录cp复制文件或目录mv移动或重命名文件或目录rm删除文件或目…...

[C语言]结构体、位段、枚举常量、联合体

目录 结构体 结构体的使用方法 结构体所占用的大小 位段 位段的使用方法 位段所占用的大小 枚举常量 枚举常量的使用方法 枚举常量的优势 联合体 联合体的使用方法 结构体 结构体的使用方法 结构体是一些值的集合,我们可以定义一个结构体,里…...

LangChain核心模块 Retrieval——文档加载器

Retrieval ​ 许多LLM申请需要用户的特定数据,这些数据不属于模型训练集的一部分,实现这一目标的主要方法是RAG(检索增强生成),在这个过程中,将检索外部数据,然后在执行生成步骤时将其传递给LLM。 ​ LangChain 提供…...

力扣爆刷第104天之CodeTop100五连刷6-10

力扣爆刷第104天之CodeTop100五连刷6-10 文章目录 力扣爆刷第104天之CodeTop100五连刷6-10一、15. 三数之和二、53. 最大子数组和三、912. 排序数组四、21. 合并两个有序链表五、1. 两数之和 一、15. 三数之和 题目链接:https://leetcode.cn/problems/3sum/descrip…...

Docker操作基础命令

注意:以下命令在特权模式下进行会更有效! 进入特权模式 sudo -ssudo su拉取镜像 sudo docker pull [镜像名] # sudo docker pull baiduxlab/sgx-rust:2004-1.1.3进入容器 端口开启服务: sudo docker start 3df9bf5dbd0c进入容器&#xf…...

LabVIEW的MathScript Node 绘图功能

该VI 借助 LabVIEW 的 MathScript Node,结合事件监听机制,实现基于 MathScript 的绘图功能,并支持通过交互控件自定义绘图属性。利用 MathScript 编写脚本完成图形初始化,再通过LabVIEW 事件结构响应用户操作,动态修改…...

API标准的本质与演进:从 REST 架构到 AI 服务集成

在当今数字化浪潮中,API 已成为系统之间沟通与协作的“语言”,REST(Representational State Transfer,表述性状态转移)是一种基于 HTTP 协议的 Web 架构风格。它不仅改变了 Web 应用开发的方式,也成为构建现…...

用电脑通过网口控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮点: 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比,使用 14 位模数转换器 (ADC) 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS 本底噪声的较小信号。使用独有区域触摸在几秒…...

QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧

文章目录 0.前言1.带命名空间Qt自定义类在QT设计器中的使用技巧1.1 定义一个带命令空间QLabel自定义类1.2 在QT设计器中引入自定义控件类 2.带命名空间Qt自定义类在qss中的使用技巧2.1 命名空间在 QSS 中的特殊语法2.1 在QSS中定义带命名空间的样式 3.在项目中使用带命名空间的…...

将 tensorflow keras 训练数据集转换为 Yolo 训练数据集

以 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 1. 图像分类数据集文件结构 (例如用于 yolov11n-cls.pt 训练) import os import csv import random from PIL import Image from sklearn.model_selection import train_test_split import s…...

低代码逻辑引擎配置化实战:三步穿透审批记录查询

在堆积如山的报销单中埋头寻找某笔特殊费用的审批轨迹在跨部门协作时被追问"这个合同到底卡在哪个环节" 在快节奏的办公自动化场景中,这些场景是很常见的,传统OA系统中分散的审批记录查询方式往往太繁琐。 为破解这一痛点,在JVS低…...

DAY 48 随机函数与广播机制

知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 作…...

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示,同时,统计目标数量以及违停数量,生成结果评估,一并发送到前端展示。对于本文任何技术上的空缺,可在博主主页前面博客…...

STM标准库-TIM旋转编码器

文章目录 一、编码器接口1.1简介1.2正交编码器1.3编码器接口基本结构**1. 模块与 STM32 配置的映射关系****2. 设计实现步骤(核心流程)****① 硬件规划****② 时钟使能****③ GPIO 配置(对应架构图 “GPIO” 模块)****④ 时基单元…...

AI时代:学习永不嫌晚,语言多元共存

最近看到两个关于AI的两个问题,“现在开始学习AI,是不是为时已晚?”、“AI出现以后,翻译几乎已到末路,那么,随着时代的进步,中文会一统全球吗?” 联想到自己正在做的“万能AI盒”小程…...