详解Mysql InnoDB引擎 04

news2024/11/20 16:25:26

文章目录

  • 1. InnoDB 简介
  • 2. 逻辑存储结构
    • 2.1 表空间 idb文件
    • 2.2 段
    • 2.3 区 1M
    • 2.4 页 16KB
    • 2.5 行
  • 3. 架构
    • 3.1 内存结构
      • 3.1.1 Buffer Pool 缓冲池
      • 3.1.2 Change Buffer 更改缓冲区
      • 3.1.3 Adaptive Hash Index
      • 3.1.4 Log Buffer
    • 3.2 磁盘结构
  • 4. 后台线程
  • 5. 事务原理
    • 5.1 redo log 重做日志
    • 5.2 undo log 回滚日志
  • 6. MVCC

1. InnoDB 简介

InnoDB 是MySQL数据库管理系统的一个存储引擎,它为MySQL提供了事务处理、外键约束和并发控制等关系型数据库管理系统(RDBMS)中重要的功能。以下是关于InnoDB存储引擎的一些关键特点和特性:

主要特点和优性

  1. 事务支持:

     InnoDB 是支持事务的存储引擎,它遵循ACID(原子性、一致性、隔离性、持久性)特性,能够确保事务的安全性和可靠性。
    
  2. 行级锁定:

     InnoDB 使用行级锁定(row-level locking),这意味着在处理并发访问时可以更好地控制和管理数据,减少了数据库锁定的竞争,提高了多用户并发访问的效率。
    
  3. 外键约束:

     InnoDB 支持外键(foreign key)约束,这使得在关系型数据库中可以方便地定义和维护表与表之间的关系,确保数据的完整性和一致性。
    
  4. 崩溃恢复:

     InnoDB 提供了良好的崩溃恢复能力,包括事务日志(transaction logs)和重做日志(redo logs),可以在数据库崩溃或者异常终止后进行数据恢复,保证数据的持久性。
    
  5. 自动增长:

     InnoDB 支持自动增长列(auto-increment),使得在插入新记录时可以自动分配唯一的值,简化了应用程序对于唯一标识符的处理。
    
  6. 高性能:

     InnoDB 被设计为高性能的存储引擎,在处理大量数据和高并发访问时表现良好,尤其是在需要复杂查询和事务处理的场景下。
    
  7. 可扩展性:
    InnoDB 提供了良好的可扩展性,支持多核处理器和大内存系统,可以有效地处理大型数据库和高负载环境。

  8. 多版本并发控制(MVCC):

     InnoDB 使用多版本并发控制来实现事务的隔离性,允许读取操作不被写操作阻塞,从而提高了数据库的并发性能。
    

可靠性和稳定性:

InnoDB 是经过长期使用和优化的成熟技术,被广泛认为是MySQL中最可靠和稳定的存储引擎之一。

2. 逻辑存储结构

在这里插入图片描述

2.1 表空间 idb文件

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

2.2 段

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

2.3 区 1M

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

2.4 页 16KB

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

2.5 行

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

  1. 事务id
  2. 存储上一条修改数据的指针

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

3. 架构

MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性。

3.1 内存结构

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

3.1.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’;

3.1.2 Change Buffer 更改缓冲区

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

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

3.1.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

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

3.2 磁盘结构

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

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

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

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

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

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

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

4. 后台线程

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

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

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

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

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

5. 事务原理

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的 两份日志来保证的,一份是redo log日志,一份是undo log日志。 而持久性是通过数据库的锁,加上MVCC来保证的。

5.1 redo log 重做日志

记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

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

有了redolog之后,当对缓冲区的数据进行增删改之后,会首先将操作的数据页的变化,记录在redo log buffer中。在事务提交时,会将redo log buffer中的数据刷新到redo log磁盘文件中。 过一段时间之后,如果刷新缓冲区的脏页到磁盘时,发生错误,此时就可以借助于redo log进行数据 恢复,这样就保证了事务的持久性。 而如果脏页成功刷新到磁盘 或 或者涉及到的数据已经落盘,此
时redolog就没有作用了,就可以删除了,所以存在的两个redolog文件是循环写的。

那为什么每一次提交事务,要刷新redo log 到磁盘中呢,而不是直接将buffer pool中的脏页刷新 到磁盘呢 ?
因为在业务操作中,我们操作数据一般都是随机读写磁盘的,而不是顺序读写磁盘。 而redo log在 往磁盘文件中写入数据,由于是日志文件,所以都是顺序写的。顺序写的效率,要远大于随机写。 这
种先写日志的方式,称之为 WAL(Write-Ahead Logging)。

5.2 undo log 回滚日志

用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和 MVCC(多版本并发控制) 。 undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的 update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些 日志可能还用于MVCC。 Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment
回滚段中,内部包含1024个undo log segment。

6. MVCC

当前读 读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加 锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select …
for update、update、insert、delete(排他锁)都是一种当前读。

快照读 简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据, 不加锁,是非阻塞读。 • Read Committed:每次select,都生成一个快照读。 • Repeatable Read:开启事务后第一个select语句才是快照读的地方。
• Serializable:快照读会退化为当前读。

MVCC 全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本, 使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需
要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

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

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

相关文章

Pytorch深度学习实践(9)卷积神经网络

卷积神经网络 全连接神经网络 神经网络中全部是线性模型,是由线性模型串联起来的 全连接网络又叫全连接层 卷积神经网络 在全连接神经网络中,由于输入必须是一维向量,因此在处理图像时必须要对图像矩阵进行拉伸成一维的形式,…

视觉巡线小车(STM32+OpenMV)——总结

文章目录 目录 文章目录 前言 一、效果展示 二、完整流程 1、STM32CubeMX配置 2、Keil编辑 3、硬件接线 4、参数调试 5、图像处理调试 三、总结 前言 基于前面的系列文章,已基本介绍完了基于STM32OpenMV的视觉巡线小车,本文将以小编自己的小车…

BACnet物联网关BL103:Modbus协议转BACnet/MSTP

随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展,构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下,我们钡铼特别推荐一款主流的BAS(楼宇自动化系统)与BACnet物联网关——BL103&a…

小世界特性解析——聚类系数与平均路径长度的奥秘

小世界特性解析——聚类系数与平均路径长度的奥秘 小世界特性的核心衡量指标 小世界特性,这一复杂网络中的重要概念,主要通过两个关键指标来衡量:聚类系数和平均路径长度。这两个指标共同揭示了网络结构的紧密程度和信息传播的效率。 聚类…

echarts没数据的时候,页面显示暂无数据

echarts没数据的时候,页面显示暂无数据 给个if判断 let option{} if(data.length0){ //没有数据或者数据不合法,显示暂无数据option {title: {text: 暂无数据,x: center,y: center,textStyle: {fontFamily: Manteka,fontSize: 12,fontWeight: normal,color: #333…

使用 Copilot 对 OneDrive 文档分享进行摘要

对于大量使用onedrive进行资料分享的用户而言,对分享的文件进行简要说明并提供给对方,是一个基本素养。 在以往,他们只能阅读文件名然后靠回忆进行撰写,或者打开每一个文档通读全文然后再关闭返回并撰写摘要。 当用户在 SharePo…

Java聚合快递小程序对接云洋系统程序app源码

​一场物流效率的革命 引言:物流新时代的序章 在数字化浪潮席卷各行各业的今天,物流行业也迎来了前所未有的变革。为了进一步提升物流效率,优化用户体验,聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…

基于JSP的毕业生就业信息管理系统

你好,我是专注于信息系统开发的码农小野!如果你对毕业生就业信息管理有需求,欢迎联系我。 开发语言:JSP 数据库:MySQL 技术:JSP技术 SSM框架 工具:Eclipse、Maven、Navicat 系统展示 首页…

登录案例(JAVA)

练习1 package lx2;import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class demo1 {/*需求:写一个登陆小案例。步骤…

Hive环境搭建(内置数据库)

实验目的】 1) 了解hive的作用 2) 熟练hive的配置过程(内置数据库) 【实验原理】 Hive的架构是由Client、Metastore、Driver、Compiler构成,执行流程是编译器可以将一个Hive QL转换成操作符,操作符是Hive中的最小处理单元。…

【BUG】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10

UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 目录 UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#x…

torch fbgemm.dll 报错

这里写自定义目录标题 OSError: [WinError 126] The specified module could not be found. Error loading \"c:\\Users\\Noor\\anaconda3\\envs\\DL\\Lib\\site-packages\\torch\\lib\\fbgemm.dll\" or one of its dependencies."https://github.com/lucasg/De…

在VMware创建Ubuntu24

目录 一、创建虚拟机 1. 自定义创建虚拟机 2. 设置虚拟机兼容 3. 选择镜像 4. 命名虚拟机,选择存放位置 5. 处理器配置 6. 内存配置 7. 网络类型配置 8. I/O控制器类型 9. 磁盘配置 10. 完成虚拟机创建 二、Ubuntu安装 1. 进入虚拟机中进行ubuntu的安…

java算法day25

java算法day25 广度优先搜索岛屿数量深搜岛屿数量广搜 广度优先搜索 核心:从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。搜索的方式是上下左右 一张图说明白模拟过程&#xff1…

21.发布确认模式-高级

问题 生产环境中由于一些不明原因,导致rabbitmq重启,在重启的期间生产者消息投递失败,导致消息丢失,需要手动处理恢复。那么如何才能进行rabbitmq的消息可靠性投递?特别是在极端的情况,rabbitmq集群不可用…

从json到protobuf,接口效率的提升

在express开发的前后端调用中,express作为服务端是不二之选,它有一些很好用的body解析器来解析传入数据;而作为请求发起方,axios是非常方便的,这是一个很好的选择,它可以传输多种类型的数据给接收方。 通常…

ios生成打包证书和描述文件(保姆级)

苹果开发者地址:Apple Developer (简体中文) 1.申请苹果App ID(App的唯一标识) 选择App IDs 选择App 输入APP ID的描述和Bundle ID Explicit:唯一的ID,用于唯一标识一个应用程序,一般选Explicit WildCard:通配符ID&am…

【初阶数据结构篇】顺序表和链表算法题

文章目录 顺序表算法题移除元素删除有序数组中的重复项合并两个有序数组 链表算法题移除链表元素反转链表链表的中间结点合并两个有序链表链表分割链表的回文结构 顺序表算法题 不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val&#x…

谷歌DeepMind的AlphaProof和AlphaGeometry 2:AI系统在国际数学奥林匹克竞赛中取得突破

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

管不住人,你就当不好官:一流高手的3大管人秘籍,价值千金

管不住人,你就当不好官:一流高手的3大管人秘籍,价值千金 秘籍一:睁眼法 古语有云:“水至清则无鱼,人至察则无友。” 驾驭下属,学会睁一只眼闭一只眼,不要一竿子打死,…