MySQL-SQL InnoDB引擎 (上)

news2024/12/28 2:44:13

♥️作者:小刘在C站

♥️个人主页: 小刘主页 

♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!

♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术

♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇!

目录

1 逻辑存储结构

 1). 表空间

2). 段

3). 区

4). 页

5). 行

2 架构

2.1 概述

6.2.2 内存结构

1). Buffer Pool

 2). Change Buffer

3). Adaptive Hash Index

4). Log Buffer

 2.3 磁盘结构

1). System Tablespace  

2). File-Per-Table Tablespaces

 3). General Tablespaces

A. 创建表空间

 B. 创建表时指定表空间

 4). Undo Tablespaces

5). Temporary Tablespaces

6). Doublewrite Buffer Files

 7). Redo Log

2.4 后台线程

1). Master Thread

2). IO Thread

 3). Purge Thread

4). Page Cleaner Thread


1 逻辑存储结构

InnoDB 的逻辑存储结构如下图所示 :

 1). 表空间

表空间是 InnoDB 存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table( 在8.0 版本中默认开启 ) ,则每张表都会有一个表空间( xxx.ibd ),一个 mysql 实例可以对应多个表空
间,用于存储记录、索引等数据。

2).

段,分为数据段( Leaf node segment )、索引段( Non-leaf node segment )、回滚段( Rollback segment ), InnoDB 是索引组织表,数据段就是 B+ 树的叶子节点, 索引段即为 B+ 树的
非叶子节点。段用来管理多个 Extent (区)。

3).

区,表空间的单元结构,每个区的大小为 1M 。 默认情况下, InnoDB 存储引擎页大小为 16K , 即一
个区中一共有 64 个连续的页。

4).

页,是 InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB 。为了保证页的连续性,InnoDB 存储引擎每次从磁盘申请 4-5 个区。

5).

行,InnoDB 存储引擎数据是按行进行存放的。

在行中,默认有两个隐藏字段:
Trx_id :每次对某条记录进行改动时,都会把对应的事务 id 赋值给 trx_id 隐藏列。
Roll_pointer :每次对某条引记录进行改动时,都会把旧的版本写入到 undo 日志中,然后这个
隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

2 架构

2.1 概述

MySQL5.5 版本开始,默认使用 InnoDB 存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是 InnoDB 架构图,左侧为内存结构,右侧为磁盘结构。

6.2.2 内存结构

 

在左侧的内存结构中,主要分为这么四大块儿: Buffer Pool Change Buffer Adaptive
Hash Index Log Buffer 。 接下来介绍一下这四个部分。

1). Buffer Pool

InnoDB 存储引擎基于磁盘文件存储,访问物理硬盘和在内存中进行访问,速度相差很大,为了尽可能弥补这两者之间的 I/O 效率的差值,就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁 I/O

InnoDB 的缓冲池中不仅缓存了索引页和数据页,还包含了 undo 页、插入缓存、自适应哈希索引以及InnoDB 的锁信息等等。

缓冲池 Buffer Pool ,是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增 删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频 率刷新到磁盘,从而减少磁盘 IO ,加快处理速度。

缓冲池以 Page 页为单位,底层采用链表数据结构管理 Page 。根据状态,将 Page 分为三种类型:

free page :空闲 page ,未被使用。
clean page :被使用 page ,数据没有被修改过。
dirty page :脏页,被使用 page ,数据被修改过,也中数据与磁盘的数据产生了不一致。
在专用服务器上,通常将多达 80 %的物理内存分配给缓冲池 。参数设置: show variables
like 'innodb_buffer_pool_size';

 2). Change Buffer

Change Buffer ,更改缓冲区(针对于非唯一二级索引页),在执行 DML 语句时,如果这些数据 Page没有在 Buffer Pool 中,不会直接操作磁盘,而会将数据变更存在更改缓冲区 Change Buffer
中,在未来数据被读取时,再将数据合并恢复到 Buffer Pool 中,再将合并后的数据刷新到磁盘中。
Change Buffer 的意义是什么呢 ?

 先来看一幅图,这个是二级索引的结构图:

 

与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘 IO 。有了 ChangeBuffer 之后,我们可以在缓冲池中进行合并处理,减少磁盘 IO

3). Adaptive Hash Index

自适应 hash 索引,用于优化对 Buffer Pool 数据的查询。 MySQL innoDB 引擎中虽然没有直接支持
hash 索引,但是给我们提供了一个功能就是这个自适应 hash 索引。因为前面我们讲到过, hash 索引在进行等值匹配时,一般性能是要高于 B+ 树的,因为 hash 索引一般只需要一次 IO 即可,而 B+ 树,可能需要几次匹配,所以 hash 索引的效率要高,但是 hash 索引又不适合做范围查询、模糊匹配等。
InnoDB 存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下 hash 索引可以提升速度,则建立 hash 索引,称之为自适应 hash 索引。
自适应哈希索引,无需人工干预,是系统根据情况自动完成。
参数: adaptive_hash_index

4). Log Buffer

Log Buffer :日志缓冲区,用来保存要写入到磁盘中的 log 日志数据( redo log undo log ),默认大小为 16MB ,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O
参数 :
innodb_log_buffer_size :缓冲区大小
innodb_flush_log_at_trx_commit :日志刷新到磁盘时机,取值主要包含以下三个:

1: 日志在每次事务提交时写入并刷新到磁盘,默认值。

0: 每秒将日志写入并刷新到磁盘一次。

2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

 2.3 磁盘结构

接下来,再来看看 InnoDB 体系结构的右边部分,也就是磁盘结构:

1). System Tablespace  

系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。 ( MySQL5.x 版本中还包含 InnoDB 数据字典、 undolog )
参数: innodb_data_file_path

 系统表空间,默认的文件名叫 ibdata1

2). File-Per-Table Tablespaces

如果开启了 innodb_file_per_table 开关 ,则每个表的文件表空间包含单个 InnoDB 表的数据和索
引 ,并存储在文件系统上的单个数据文件中。
开关参数: innodb_file_per_table ,该参数默认开启。

 

那也就是说,我们没创建一个表,都会产生一个表空间文件,如图:

 3). General Tablespaces

通用表空间,需要通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。

A. 创建表空间

CREATE TABLESPACE ts_name ADD DATAFILE 'file_name' ENGINE = engine_name; 

 B. 创建表时指定表空间

CREATE TABLE xxx ... TABLESPACE ts_name;

 4). Undo Tablespaces

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

5). Temporary Tablespaces

InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。

6). Doublewrite Buffer Files

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

 7). Redo Log

重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲( redo log
buffer )以及重做日志文件( redo log , 前者是在内存中,后者在磁盘中。当事务提交之后会把所
有修改信息都会存到该日志中 , 用于在刷新脏页到磁盘时 , 发生错误时 , 进行数据恢复使用。

 以循环方式写入重做日志文件,涉及两个文件:

 

前面我们介绍了 InnoDB 的内存结构,以及磁盘结构,那么内存中我们所更新的数据,又是如何到磁盘中的呢? 此时,就涉及到一组后台线程,接下来,就来介绍一些 InnoDB 中涉及到的后台线程。

 

2.4 后台线程

 

InnoDB 的后台线程中,分为 4 类,分别是: Master Thread IO Thread Purge Thread
Page Cleaner Thread

1). Master Thread

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

2). IO Thread

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

 我们可以通过以下的这条指令,查看到InnoDB的状态信息,其中就包含IO Thread信息。

show engine innodb status \G;

 3). Purge Thread

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

4). Page Cleaner Thread

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

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家

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

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

相关文章

使用VuePress生成静态网站并部署到github

目录 第一步 安装VuePress第二步 书写博客第二步 部署到github 第一步 安装VuePress VuePress是一个基于Vue驱动的静态网站生成器 相关资料 文档:https://v1.vuepress.vuejs.org/zh/github: https://github.com/vuejs/vuepressvuepress-deploy: https://github.c…

在 CentOS 7/8 上安装 NVIDIA Container Toolkit

文章目录 设置存储库和 GPG 密钥更新包列表后安装 nvidia-container-toolkit 包(和依赖项)配置 Docker 守护进程以识别 NVIDIA 容器运行时设置默认运行时后,重新启动 Docker 守护进程以完成安装测试 参考官方文档,在 CentOS 7 上…

测试用例设计简单吗?简单!但你有可能栽在这5道S级测试用例设计题上!(附答案)

很多人不知道写测试用例有什么用,而仅仅是像工具人一样,在每次提测之前,把测试用例照着需求文档抄一遍,仿佛像是走个过场。 开发提测之后,就照着测试用例点点点,可能一天就走完用例了,开发代码写…

Spring专家课程Day01_Spring-IOC

​ 文章目录 基础配置1)基础文件结构(Maven项目创建) 一、01_Spring概述_IOC_HelloWorld1.Spring框架的两个核心功能1.1) IOC/DI ,控制反转依赖注入!1.2) AOP,面向切面编程 2.IOC的两种模式2.1)配置文件中配置 Bean2.2)配置文件,组件扫描注解类注解Component 二、02_JavaBean_J…

数睿通2.0功能发布—集成Doris、数仓动态配置、质量任务完善、接入速度优化

文章目录 引言集成 Doris数仓动态配置质量任务完善接入速度优化结语 引言 数睿通 2.0 数据中台迎来了 6 月份的更新,本次更新集成了 Doris 数据库,可用于数据集成,数据开发等模块。过去数仓使用的是 TiDB,新版本可以根据自身需求…

记一次移动九联UNT401H电视盒子免拆刷机(图文详细教程 附所有软件)

文章目录 1.准备1.硬件介绍2.刷机硬件3.相关软件1.刷机软件2.工具软件 2.刷机1.开启adb2.查看IP地址3.写入recovery4.刷入系统 3.系统使用1.首次启动2.安装第三方软件安装blibili tv看IPTV 4.总结附: 声明:本安卓固件,仅供内部测试和技术交流…

vue element UI在button按钮使用 @keyup.enter不生效

如图所示,没效果。在按钮上绑定keyup事件,加上.native覆盖原有封装的keyup事件 解决办法 created () {document.onkeyup e > {if (e.keyCode 13 && e.target.baseURI.match(/login/)) {// 调用登录 验证方法this.submitForm()}}}成功解决&…

Java 使用hutool工具进行导出excel表格(代码很简单)

1.先引入hutool的相关依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.4</version></dependency><dependency><groupId>org.apache.poi</…

【youcans动手学模型】SqueezeNet 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】SqueezeNet 模型-CIFAR10图像分类 1. SqueezeNet 卷积神经网络模型1.1 模型简介1.2 论文介绍1.3 分析与讨论 2. 在 PyTorch 中定义 SqueezeNet 模型类2.1 定义 Fire Module2.2 …

少有人告诉你!工科硕士对应届生的肺腑之言!

自己是电子信息工科硕士狗一枚&#xff0c;自认为毕业于985院校还可以。刚毕业时&#xff0c;去了一家世界500强公司&#xff0c;校招签约时只说是“技术岗”&#xff0c;没有指定具体岗位。等待毕业的时间里&#xff0c;对新公司、新岗位充满了无限的期待&#xff0c;认为自己…

5、R语言所需安装包安装教程

一、R包安装 1.鼠标右键&#xff0c;以管理员的身份运行&#xff0c;然后点击确定。 2.点击安装导向中的下一步。 3.修改安装路径&#xff0c;安装到自己所需的路径&#xff0c;然后点击下一步。 4.勾选自己所需组件&#xff0c;然后点击下一步。 5.启动选项&#xff0c;选…

百万奖金悬赏大模型不擅长的任务!这 11 个任务模型越大,效果越差!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 去年咱们在介绍百万悬赏时提到&#xff0c;“海量资源砸出的大模型真的会一直那么香吗&#xff1f;”&#xff0c;目前来看&#xff0c;自打 ChatGPT 横空出世引领一众大模型开辟新的生活和工作方式以来&#xff0c;还是挺香的…

vue — 高德地图实现来回切换卫星图

默认初始化地图展示标准3d地图&#xff08;这里添加蒙层&#xff09; initMap () {this.mapObj new AMap.Map(mapContainer, {features: [bg, road, point, building],showLabel: true,rotateEnable: false,pitchEnable: false,zoom: 17,pitch: 65,rotation: 45,viewMode: 3D,…

一起学SF框架系列4.8-模块context-事件机制(Event)

ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口提供的。如果将实现ApplicationListener接口的bean部署到上下文中&#xff0c;则每次将ApplicationEvent发布到ApplicationContext时&#xff0c;都会通知该bean。从本质上讲&#xff0c;这是…

Allegro如何使用打印预览功能操作指导

Allegro如何使用打印预览功能操作指导 Allegro时常需要使用打印功能,将某个视图打印成pdf文件,如下图 在打印成pdf文件之前,可以使用打印预览的功能,具体操作如下 点击shape Add Rect命令Options出现如下选项<

阿里云地域和可用区分布表

阿里云服务器地域和可用区有哪些&#xff1f;阿里云服务器地域节点遍布全球29个地域、88个可用区&#xff0c;包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域&#xff0c;同一个地域下有多个可用区可以选择&#xff0c;阿里云服务器网分享2023新版…

Nginx的Location和Rewrite

目录 Rewrite简介 1.0 Rewrite实际场景 1.1 Rewrite跳转场景 1.2 Rewrite跳转实现 1.3 Nginx正则表达式 1.4 Rewrite命令&&语法格式 1.5 flag标记说明 2 Location分类 2.1 Location优先级 3 Rewrite&&Location比较 4 场景跳转实验 4.1 基于域名的跳转 …

vcruntime140.dll无法继续执行代码怎么办

今天打开photoshop软件的时候&#xff0c;突然间就打不开&#xff0c;电脑报错由于找不到vcruntime140.dll&#xff0c;无法继续执行此代码&#xff0c;然后我就把photoshop卸载了&#xff0c;再重新安装&#xff0c;依然还是报错。这个可怎么办&#xff1f;vcruntime140.dll如…

【笔记】肥胖代码:减肥的秘密

直接原因与根本原因 直接原因与根本原因的区别是什么&#xff1f;直接原因是直接造成体重增加的原因&#xff0c;根本原因是导致事物发生变化的根源。 以酗酒为例。酗酒的原因是什么&#xff1f; 直接原因是饮酒过量。这是不可否认的事&#xff0c;但显然不能解决问题。直接…

佑友防火墙默认口令及RCE漏洞

先用fofa脚本爬取所有碧海威相关资产&#xff08;fofa脚本下载地址&#xff1a;&#xff09; python3 fofa-cwillchris.py -k title"佑友防火墙" 将上面爬取到的文件&#xff08;一般是final****.txt&#xff09;移动到脚本目录下&#xff0c;保存为1.txt ./佑友防…