详解Mysql InnoDB引擎 04

文章目录

  • 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://xiahunao.cn/news/3269977.html

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

相关文章

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类? 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

LangChain曝关键漏洞,数百万AI应用面临攻击风险

LangChain是一个流行的开源生成式人工智能框架,其官网介绍,有超过一百万名开发者使用LangChain框架来开发大型语言模型(LLM)应用程序。LangChain的合作伙伴包括云计算、人工智能、数据库和其他技术开发领域的许多知名企业。 近日&…

前端模块化CommonJS、AMD、CMD、ES6

在前端开发中,模块化是一种重要的代码组织方式,它有助于将复杂的代码拆分成可管理的小块,提高代码的可维护性和可重用性。CommonJS、AMD(异步模块定义)和CMD(通用模块定义)是三种不同的模块规范…

数据库设计过程概述

1.首先进行需求分析,通过数据流图,数据字典,需求说明书等确定数据处理要求 2.概要结构设计 3.逻辑结构设计 4.物理设计

计算机二级题--结构体及链表 章节

之前写的有结构体全部的知识点,这一篇主要针对计算机二级真题的整理。 需要备考计算机二级的小伙伴们先收藏起来吧。整理不易,不过有帮助记得点赞哦 高频考点(容易出错,附有例题) 1.结构体传参,传值的区…

数字图像处理中的常用特殊矩阵及MATLAB实现详解

一、前言 Matlab的名称来源于“矩阵实验室(Matrix Laboratory)”,其对矩阵的操作具有先天性的优势(特别是相对于C语言的数组来说)。在数字图像处理中,为了提高编程效率,我们可以使用多种方式来创…

MATLAB基础:函数与函数控制语句

今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法,可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如,我们输入lookfor inpu…

JDK的配置

安装好JDK后,配置三个环境变量 第一步,配置JAVA_HOME. 先找到JDK的安装目录,然后复制路径,在电脑的环境变量里增添变量名为JAVA_HOME,变量值为 C:\Program Files\Java\jdk1.8.0_192。(具体根据你的JDK安装路径&…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求,需要使用flutter 来做一个圆形进度条,这可难倒我了,毕竟我是做前端的,flutter 之前接触的也少,但没办法,既然需求有了,也得硬着头皮上了,先来看看做的效果。…

一些电脑的操作技巧,你知道吗?

我整理了几个电脑使用的实用技巧,能够帮你提升办公效率,一起来看看吧! 技巧一:反方向移动单元格 一般来讲,我们按下【Tab】键、【Enter】键的时候,会切换到右边或者下边的单元格,想要反向移动…

c-periphery RS485串口库文档serial.md(serial.h)(非阻塞读)(VMIN、VTIME)

c-peripheryhttps://github.com/vsergeev/c-periphery 文章目录 NAMESYNOPSISENUMERATIONS关于奇偶校验枚举类型 DESCRIPTIONserial_new()serial_open()关于流控制软件流控制(XON/XOFF)硬件流控制(RTS/CTS)选择流控制方法 serial_…

基于Java+SpringMvc+Vue技术的慈善捐赠平台设计与实现(源码+LW+部署讲解)

项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑! 软件开发环境及开发工具: 操作系统:Windows 10、Windows 7、Windows 8 开发语言:java 前端技术:JavaScript、VUE.j…

水源地(水库)水质、水位、流量监测系统

随着全球气候变化和工业化进程的加速,水库作为重要的水资源储备和调节设施,其水质、水位和流量的监测与管理显得尤为重要。水库水质、水位、流量综合监测系统正是在这样的背景下应运而生,旨在实现对水库水资源的全面、实时、准确的监测与管理…

【吊打面试官系列-Dubbo面试题】Dubbo 服务降级,失败重试怎么做?

大家好,我是锋哥。今天分享关于 【Dubbo 服务降级,失败重试怎么做?】面试题,希望对大家有帮助; Dubbo 服务降级,失败重试怎么做? 可以通过 dubbo:reference 中设置 mock"return null"…

基于微信小程序+SpringBoot+Vue的自助点餐系统(带1w+文档)

基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序的自助点餐系统前后台分离,让商品订单,用户反馈信息,商品信息等相关信息集中在后台让管理员管理,让用…

【杰理蓝牙开发】AC695x 音频部分

本文主要记录 杰理蓝牙audio接口的使用,包括ADC和DAC原理的介绍和API接口的使用。 【杰理蓝牙开发】AC695x 音频部分 0. 个人简介 && 授权须知1. ADC【音频数据采集】硬件部分1.1 单片机引脚1.2 硬件电路设计1.3 MIC 输入通路解释 2. 【DAC】音频信号编解码…

【LLM】-10-部署llama-3-chinese-8b-instruct-v3 大模型

目录 1、模型下载 2、下载项目代码 3、启动模型 4、模型调用 4.1、completion接口 4.2、聊天(chat completion) 4.3、多轮对话 4.4、文本嵌入向量 5、Java代码实现调用 由于在【LLM】-09-搭建问答系统-对输入Prompt检查-CSDN博客 关于提示词注入…

生成式AI入门,我推荐这本书

对于生成式AI入门,选择一本合适的书籍是至关重要的。以下是一本备受推荐的书籍,它非常适合作为生成式AI入门的首选: 《生成式AI入门与AWS实战》 专业评论 这本书非常适合用于入门生成式 AI 应用程序开发。互联网上关于这个主题的信息铺天盖地…

ByteBuffer调试工具类

一个可以形象展示ByteBuffer内容的方法,便于调试 package com.example.netty;import java.nio.ByteBuffer;public class ByteBufferUtil {/*** 打印ByteBuffer的内容,以十六进制和ASCII字符的形式展示。** param buffer 要展示的ByteBuffer*/public sta…

实战|EDU挖掘记录-某学校sql注入挖掘记录

本文来源无问社区,更多实战内容,渗透思路尽在无问社区http://www.wwlib.cn/index.php/artread/artid/9755.html 某大学的办公系统,学号是我从官网下载的优秀人员名单找到的,初始密码为姓名首字母加身份证后六位,我是社…