MySQL高级----InnoDB引擎

逻辑存储结构

表空间 

表空间(ibd文件),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 

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

区 

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

页 

页,是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区。我们表结构中存储的记录以及索引都是在页中存储的。

行 

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

架构

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

内存结构 

Buffer Pool:缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。缓冲池以Page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型: 

free page:空闲page,未被使用。 
clean page:被使用page,数据没有被修改过。
dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致(缓冲区的数据改了,但是磁盘中的数据还没有修改即缓冲区的数据还未刷到磁盘上)。

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

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

Adaptive Hash Index:自适应hash索引,用于优化对Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,则建立hash索引,称之为自适应hash索引。自适应哈希索引,无需人工干预,是系统根据情况自动完成。

参数: adaptive_hash_index 默认是开启的。

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

参数: innodb_log_buffer_size:缓冲区大小。
         innodb_flush_log_at_trx_commit:日志刷新到磁盘时。

 

硬盘结构 

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

File-Per-Table Tablespaces:每个表的文件表空间包含单个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),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中,用于在刷新脏页到磁盘时,发生错误时,进行数据恢复使用。 

后台线程 

后台线程的主要作用是将内存中的数据在合适的时机刷新到磁盘当中。
 

1.Master Thread 

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

2.IO Thread 

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

 

3.Purge Thread 

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

4.Page Cleaner Thread  

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

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

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

相关文章

一道题彻底搞懂Java类的加载顺序

源码 建议先给出自己的答案,不要复制然后去运行,这样就没有意义。出现错误也没有关系。 public class Main {private static int k 1;private static Main m1 new Main("m1");private static Main m2 new Main("m2");private s…

MyBatis的底层机制

手写MyBatis底层机制 读取配置文件,得到数据库连接 思路 引入必要的依赖需要写一个自己的config.xml文件,在里面配置一些信息,driver,url ,password,username需要编写Configuration类,对 自己…

【Java探索之旅】多态:向上下转型、多态优缺点、构造函数陷阱

文章目录 📑前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯🌤️全篇总结 📑前言 在面向对象编程中,向上转型和向下转型是常用…

Docker-11☆ Docker Compose部署RuoYi-Cloud

一、环境准备 1.安装Docker 附:Docker-02-01☆ Docker在线下载安装与配置(linux) 2.安装Docker Compose 附:Docker-10☆ Docker Compose 二、源码下载 若依官网:RuoYi 若依官方网站 鼠标放到"源码地址"上,点击"RuoYi-Cloud 微服务版"。 跳转至G…

Splunk Enterprise 任意文件读取漏洞(CVE-2024-36991)

文章目录 前言漏洞描述影响版本漏洞复现POC批量检测-nuclei脚本 修复建议 前言 Splunk Enterprise 是一款强大的机器数据管理和分析平台,能够实时收集、索引、搜索、分析和可视化来自各种数据源的日志和数据,帮助企业提升运营效率、增强安全性和优化业务…

C++11右值引用及移动构造

区分左值和右值 在学习c11的右值引用前,大家肯定会有点陌生什么是右值?什么是左值?现在我先来带大家熟悉一下概念。 左值 可以被取地址,也可被修改(const修饰的除外) 可以出现在等号左边,也可…

软件架构之开发方法

软件架构之开发方法 第6章:开发方法6.1 软件生命周期6.2 软件开发模型6.2.1 瀑布模型6.2.2 演化模型6.2.3 螺旋模型6.2.4 增量模型6.2.5 构件组装模型 6.3 统一过程6.4 敏捷方法6.4.1 极限编程6.4.2 特征驱动开发6.4.3 Scrum6.4.4 水晶方法6.4.5 其他敏捷方法 6.5 软…

开源模型应用落地-FastAPI-助力模型交互-进阶篇(一)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…

Java线程的创建·启动和休眠

一.线程的创建和启动 Java中创建线程的两种方式 ◆继承java.lang.Thread类 ◆实现java.lang.Runnable接口 ◆使用线程的步骤 继承Thread类创建线程 ◆自定义线程类继承自Thread类 ◆重写run()方法,编写线程执行体 ◆创建线程对象,调用start()方法启动…

数据驱动制造业升级,免费可视化工具成关键

制造业作为国民经济的支柱产业,正经历着前所未有的变革。数据,作为这场变革的核心驱动力,其重要性不言而喻。然而,面对海量且复杂的数据,如何高效、直观地将其转化为有价值的洞察,成为了众多制造企业亟待解…

前端面试题25(css常用的预处理器)

在前端开发领域,CSS预处理器在面试中经常被提及,其中最流行的三种预处理器是Sass、LESS和Stylus。下面分别介绍它们的特点和优势: 1. Sass(Syntactically Awesome Style Sheets) 优势: 变量:允…

实战Qt开发WordBN笔记软件#01 搭建开发环境:VS2019+Qt6.5+CMake+Git

01 背景 【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用Qt Quick(QML)开发语言。 本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言&am…

从新手到高手:Scala函数式编程完全指南,Scala IF…ELSE 语句(8)

1、Scala IF…ELSE 语句 Scala IF…ELSE 语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 1.1、if 语句 if 语句有布尔表达式及之后的语句块组成。 语法 if 语句的语法格式如下&…

LT7911UX 国产原装 一拖三 edp 转LVDS 可旋转 可缩放

2.一般说明 该LT7911UX是一种高性能Type-C/DP1.4a到MIPI或LVDS芯片的VR/显示应用。HDCP RX作为HDCP转发器的上游,可以与其他芯片的HDCP TX配合实现转发器功能。 对于DP1.4a输入,LT7911UX可配置为1/2/4通道。自适应均衡使其适用于长电缆应用,最…

python对象

类 我们目前所学习的对象都是Python内置的对象但是内置对象并不能满足所有的需求,所以我们在开发中经常需要自定义一些对象类,简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象类就是对象的图纸!我们也称对象是类的实例&#…

给您介绍工控CAN总线

CAN是什么 CAN,全称Controller Area Network,即控制器局域网,是一种由Bosch公司在1983年开发的通信协议。它主要用于汽车和工业环境中的电子设备之间的通信。CAN协议定义了物理层和数据链路层的通信机制,使得不同的设备能够通过CA…

LabVIEW开发商业软件的多角度分析与注意事项

在使用LabVIEW开发商业软件时,有许多方面需要考虑和注意,包括项目管理、架构设计、性能优化、用户体验、安全性、维护与支持等。以下是从多个角度详细分析在LabVIEW中开发商业软件需要注意的事项。 项目管理 需求分析:确保深入了解客户需求&a…

BFS:边权相同的最短路问题

一、边权相同最短路问题简介 二、迷宫中离入口最近的出口 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};int nearestExit(vector<vector<char>>& maze, vector<int>& e…

使用C++实现ATM系统,谈谈思路及代码实现

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;