【Mysql】InnoDB引擎

news2024/10/2 22:27:52

【Mysql】InnoDB引擎

文章目录

  • 【Mysql】InnoDB引擎
    • 1. 逻辑存储结构
    • 2. 架构
      • 2.1 概述
      • 2.2 内存结构
        • 2.2.1 Buffer Pool(缓冲池)
        • 2.2.2 Change Buffer(更改缓冲区)
        • 2.2.3 Adptive Hash Index(自适应hash索引)
        • 2.2.4 Log Buffer(日志缓冲区)
      • 2.3 磁盘结构
        • 2.3.1 System Tablespace(系统表空间)
        • 2.3.2 File-Per-Table Tablespaces
        • 2.3.3 General Tablespaces(通用表空)
        • 2.3.4 Undo Tablespaces(撤销表空间)
        • 2.3.5 Temporary Tablespace(临时表空间)
        • 2.3.6 Doublewrite Buffer Files(双写缓冲区)
        • 2.3.7 Redo Log(重做日志)
      • 2.4 后台线程
        • 2.4.1 Master Thread(核心后台线程)
        • 2.4.2 IO Thread(IO线程)
        • 2.4.3 Purge Thread(回收线程)
        • 2.4.4 Page Cleaner Thread

1. 逻辑存储结构

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

image-20230224103425591

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

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

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

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

  • 行(Row):InnoDB存储引擎数据是按行进行存放的。

    在行中,默认有两个隐藏字段:

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

2. 架构

2.1 概述

MYSQL5.5版本开始,默认使用InnoDB存储引擎,他擅长事务处理,具有崩溃恢复特性。在日常开发 中使用非常广泛。

下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构

image-20230224110451296


2.2 内存结构

image-20230224110516631

在左侧的内存结构中,主要分为四大块:Buffer Pool(缓冲池)、Change Buffer(更改缓冲区)、Adaptive Hash Index(自适应hash索引)、Log Buffer(日志缓冲区)。

2.2.1 Buffer Pool(缓冲池)

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

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

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

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

  1. free page:空闲page,未被使用。
  2. clean page:被使用,数据没有被修改过。
  3. dirty page:脏页,被使用page,数据被修改过,页中数据与磁盘的数据产生了不一致。

在专用服务器上,通常将多达80%的物理内存分配给缓冲池。

参数设置:

show variables like 'innodb_buffer_pool_size';

image-20230224112352544


2.2.2 Change Buffer(更改缓冲区)

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

Change Buffer 存在的意义:

如下是二级索引的结构图:

image-20230224113143566

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


2.2.3 Adptive Hash Index(自适应hash索引)

自适应hash索引用于优化对Buffer Pool数据的查询。MySQL的innoDB引擎中虽然没有直接支持hash索引,但是给我们提供了一个功能就是这个自适应hash索引。因为前面我们讲到过,hash索引在进行等值匹配时,一般性能是要高于B+树的,因为hash索引一般只需要一次IO即可,而B+树,可能需要几次匹配,所以hash索引的效率要高,但是hash索引又不适合做范围查询、模糊匹配等。

InnoDB存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下hash索引可以提升速度, 则建立hash索引,称之为自适应hash索引。

自适应哈希索引,无需人工干预,是系统根据情况自动完成。

参数: adaptive_hash_index


2.2.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: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

image-20230224114847113


2.3 磁盘结构

如下是磁盘结构图:

image-20230224123314260

2.3.1 System Tablespace(系统表空间)

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

参数:innodb_data_file_path

image-20230224124813358

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


2.3.2 File-Per-Table Tablespaces

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

开关参数:innodb_file_per_table ,该参数默认开启。

image-20230224125054378

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

image-20230224125118747


2.3.3 General Tablespaces(通用表空)

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

A.创建表空间

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

image-20230224125640010

B.创建表时指定表空间

CREATE TABLE xxx ... TABLESPACE ts_name;

image-20230224125738184


2.3.4 Undo Tablespaces(撤销表空间)

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


2.3.5 Temporary Tablespace(临时表空间)

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


2.3.6 Doublewrite Buffer Files(双写缓冲区)

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

双写缓冲区文件:

image-20230224130632676


2.3.7 Redo Log(重做日志)

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

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

image-20230224131051001


2.4 后台线程

在InnoDB的后台线程中,分为4类,分别是:

  • Master Thread
  • IO Thread
  • Purge Thread
  • Page Cleaner Thread

image-20230224131534719


2.4.1 Master Thread(核心后台线程)

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


2.4.2 IO Thread(IO线程)

在InnoDB存储引擎中大量使用了AIO(异步非阻塞IO)来处理IO请求,而IO Thread主要负责这些IO请求的回调。

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

2.4.3 Purge Thread(回收线程)

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


2.4.4 Page Cleaner Thread

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

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

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

相关文章

图解LeetCode——剑指 Offer 42. 连续子数组的最大和

一、题目 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 二、示例 2.1> 示例1: 【输入】 nums [-2,1,-3,4,-1,2,1,-5,4] 【输出】 6 【解释】 连续子数组 [4,-1,2,1] 的和最大,…

鉴源论坛 · 观擎丨民机机载软件中的开发和验证工具

作者 |蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 工具鉴定 现代软件工程中,工具已经出现在软件研制过程中的各个环节中。在常见的软件研制环节中,使用工具包括软件需求工具、软件设计工具、软件架构工具和软件测试工具等。这…

【C++】模板与STL库

STL(标准模板库) 文章目录模板STL模板 模板是泛型编程的基础,泛型编程以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们…

线性判别分析仅在线性可分数据上能获得理想结果

Q: 线性判别分析仅在线性可分数据上能获得理想结果, 试设计一个改进方法, 使其能较好地用于飞线性可分数据 The same for “Linear discriminant analysis can only obtain ideal results on linearly separable data. Try to design an improved method to make it better us…

Vue3:自定义指令以及简单的后台管理权限封装

目录 前言: 自定义指令介绍: 局部的自定义指令: 全局自定义指令: 讲讲后台管理权限管理: 前言: 说起这个自定义指令的使用场景,我第一反应就是,后台管理的权限管理,要…

VBA学习——1

VBA 过程的基本语法如下: Sub 过程名(参数)语句1语句2...End SubVBA 函数与 VBA 过程很相似,除了使用的关键词外,主要区别是,函数可以返回值。 Function [函数名]([参数]) As [返回值类型]语句1 语句2 ... 语句n [函…

Servlet笔记(9):Cookie处理

一、Cookies处理 1、Cookies概念 Cookies是存储在客户端计算机上的文本文件,并保留各种跟踪信息。 识别返回用户的三个步骤 服务器脚本向浏览器发送一组Cookies。例如姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上。当下一次浏览器向Web服务器发送…

SSM+HTML搭建(小白教学)

最近做项目,觉得还是有意义记录以下前后端框架是怎么搭建的,今天给大家介绍介绍SSM:SpringBootSpringMVCMyBatis后端搭建:SpringBoot快速搭建的网站(Spring Initializr)选择创建之后,会下载到一个zip压缩包,对压缩包进行解压(包地址一般选择后端项目的放的文件夹中)用idea打开项…

每日学术速递2.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.BUAA_BIGSCity: Spatial-Temporal Graph Neural Network for Wind Power Forecasting in Baidu KDD CUP 2022 标题:BUAA_BIGSCity:百度KDD CUP 2022风电预测…

警惕!黑客正疯狂实施网络攻击,网站该如何防范?

自2021年以来,ATW组织宣称披露涉我国重要信息系统源代码、数据库等敏感信息70余次,涉及国家重要政府部门、航空、基础设施等100余家单位的300余个信息系统,尤其2022年以来,ATW组织滋扰势头加剧,持续对中国的网络目标实…

数据结构预算法之买股票最好时机动态规划(可买卖多次)

一.题目二.思路在动规五部曲中,这个区别主要是体现在递推公式上,其他都和上一篇文章思路是一样的。所以我们重点讲一讲递推公式。这里重申一下dp数组的含义:dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如…

【Http1.0和Http1.1的区别?Http1.1和Http2.0的区别?】

计算机网络面试的相关知识你可不能不知道呀!Http1.0和Http1.1的区别?Http1.1和Http2.0的区别? Http1.0和Http1.1的区别? 连接方式 : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。状态响应码 : HTTP/1.1中新加入了大量的状…

小型水库大坝安全监测的主要对象

一、监测背景 大坝监测的目的分成两个大的方面,一方面是为了验证设计、指导施工、为科研提供必要的资料;另一方面,也可以说是更重要的方面,就是为了长期监视大坝的安全运行。因此,一个成功的监测设计者不仅要能充分领会…

Vmware 虚拟机无法联通主机

问题描述:今天使用Vmware Workstation 创建CentOS-7 虚拟机,基于CentOS-7 搭建Hadoop3 伪分布式版本,CentOS-7 测试Hadoop 3 服务正常启动,通过主机连接Hadoop 3的管理平台,提示如下错误信息:尝试解决办法&…

Android---Handler 源码解析

在 android 开发中,经常会在子线程中进行一些操作,当操作完后会通过 handler 发送一些数据给主线程,通知主线程做响应的操作。原理:子线程 handler 主线程,其实构成了线程模型中的经典问题,生产者-消费者模…

HHDESK文本对比功能

对比文件夹和图片而言,文本的更改更加频繁且琐碎;个别词语的更改更是让人“健忘”。 如果有一款工具能够直观的对文本进行对比,并且清晰的划分显示,那么便可以大量节约办公人员的精力和时间。 1 文本对比功能简介 版本更新&…

Ubuntu20.04配置深度学习环境

Ubuntu20.04配置深度学习环境 对于一台新Ubuntu20.04主机,想要直接进行深度学习模型的训练,需要进行一些常规配置。本文针对的情况包括物理机和虚拟机。安装部分本文不介绍,只介绍配置环境部分。 1. 安装中文输入法 参考如下博客&#xff…

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)

在这个圈子技术门类中,工作岗位主要有以下三个方向: 安全研发 安全研究:二进制方向 安全研究:网络渗透方向 下面逐一说明一下. 第一个方向:安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…

《卓有成效的管理者》系列-总结篇

作者【美】彼得-德鲁克简介书中提到,每一位知识工作者其实都是管理者,而且卓有成效是每个管理者必须做到的事。书中认为所有负责行动和决策而且能够提高机构工作效率的人,都应该像管理者一样工作和思考。而且,一位卓有成效的管理者…

自考都有哪些科目?怎么搭配报考?

第一次自考科目搭配 先报理论课,熟悉学习和考试套路 参考搭配模式: 一、全报考公共课 公共课难度较低,通过率高,复习起来比较轻松。对于不确定考什么专业,后期想换专业的同学,考过公共课&#xff0c…