13 SQL进阶-InnoDB引擎(8.23)

一、逻辑存储结构

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

cd /var/lib/mysql

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

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

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

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

二、架构

1、架构图

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

InnoDB架构图,左侧内存结构,右侧磁盘结构

2、内存结构

(1)buffer pool:缓冲池

dirty page:缓冲区的页还没有刷新到磁盘上。

(2)change buffer:更改缓冲区

对唯一索引和主键索引不会操作更改缓冲区。

在执行增删改语句时,不是直接操作到磁盘,而是将数据变更存放在更改缓冲区,再以一定频率将将数据放入缓冲池,再刷新到磁盘中。

(3)log buffer:日志缓冲区

(4)adaptive hash index:自适应哈希索引

InnoDB默认不支持哈希索引,默认B+索引。哈希索引不支持范围查询,支持等值匹配。

3、磁盘结构

(1)system tablespace:系统表空间

参数:innodb_data_file_path

(2)file-per-table tablespaces(每张表独立的表空间)

参数:innodb_file_per_table

(3)general tablespaces(通用表空间)

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

语法:

create tablespace xxx add datafile ·file_name· engine = engine_name;

create table xxx tablespace ts_name;

cd /var/lib/mysql

(4)undo tablespace:撤销表空间

(5)temporary tablespace:临时表空间

(6)doublewrite buffer files:双写缓冲区

 

(7)redo log:重做日志

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

4、后台线程

后台线程:在合适的时机,将InnoDB存储引擎缓冲池中的数据刷新到磁盘文件中。

(1)master thread

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

(2)IO Thread

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

(3)Purge Thread

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

(4)page cleaner thread

协助master thread刷新脏页到磁盘的现场,它可以减轻master thread的工作压力,减少阻塞。

三、事务原理

1、事务原理概述

事务特性:

2、redo log:重做日志

redo log实现持久性

当客户端发起事务操作时,先操作缓冲区,在缓冲区查找是否有我们要操作的数据,没有数据则通过后台线程去磁盘读取该数据,缓存在缓冲区中,进行增删改操作后,将增删改的数据直接写入redo log buffer,记录数据页变化,然后直接将其刷新在磁盘文件redo log file内。过段时间进行脏页刷新时,若程序出错,可通过redo log进行恢复。

为WAL(write-ahead logging)先写日志

每隔一段时间会清理redo log file,因此,这两个文件是循环写的。

3、undo log:回滚日志(Ctrl+Z)

undolog实现原子性

在进行update操作时,undo log记录更新前的数据。

undo log销毁:当我们在进行回滚操作后,undo log就没有用了,会进行销毁,但不会立即删除,因为还有可能用于MVCC(多版本并发控制)。

4、MVCC(多版本并发控制)

(1)基本概念

①当前读:

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

演示:

开启两个客户端,在第一个客户端执行select * from student;

在第二个客户端执行update操作:

此时在第一个客户端执行select * from student;无法查询到更新后的数据,第二个客户端commit;后也无法查询到更新后的语句,要读取最新的数据,即当前读,要执行select * from student lock in share mode;

②快照读

前文在第一个客户端执行select * from student;无法查询到更新后的数据,第二个客户端commit;后也无法查询到更新后的语句,即为快照读。

repeatable read:

在一个事务中第一次执行select * from student;为快照读的地方,后面执行的select * from student为读取前面的快照数据。

③MVCC(multi-version concurrency control)

三个隐式字段、undo log、readview

(2)MVCC-隐式字段

创建了一张表,含三个字段id、age、name,在InnoDB引擎中还会增加三个字段

使用ibd2sdi student.ibd查询表结构

可以看到两个隐式字段,由于这张表有主键,第三个隐式字段不会被自动创建

(3)MVCC-undo log

有数据如下所示:

要执行下面的事务:

首先要执行事务2,update操作,现在undo log日志中记录更新前的数据:

然后再修改数据;

同理执行事务2:

执行事务3:

undo log版本链:

(4)MVCC-readview

读取记录由readview决定

(5)MVCC-RC级别

每一次执行快照读时生成readview

分析事务5:

当第一次执行查询id为30的记录时,readview为如下所示:

由于事务2已经提交了,所以当前活跃事务为3,4,5

事务5要查询数据,快照读为他生成的,creator_trx_id=5

带入db_trc_id=4,都不行,沿着版本链带入db_trc_id=3,失败

带入=2时,满足第二条,查询到这条:

当第二次查询id为30的记录时,readview为如下所示:

依次带入:

查询到这条数据:

(6)MVCC-RR级别

RR隔离级别下,仅在事务第一次执行快照读时生成readview,后续复用该readview。

事务5中,两次查询id为30的记录,两次readview都如下所示:

规则和上面一样,两次查询到的为:

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

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

相关文章

MTK Linux DRM分析(二十四)- MTK mtk_drm_plane.c

一、代码分析 mtk_drm_plane.h 和 mtk_drm_plane.c 两个文件,并生成基于文本的函数调用图,我将首先解析文件中的主要函数及其功能,然后根据代码中的调用关系整理出调用图。由于文件内容较长,我会专注于关键函数及其相互调用关系,并以清晰的文本形式呈现。 文件分析 1. …

滚珠导轨如何赋能精密制造?

在智能制造发展的趋势下,新兴行业对高精度、高稳定性的运动控制需求激增。作为直线传动领域的“精密纽带”,滚珠导轨凭借低摩擦、长寿命、高刚性优势,广泛应用于精密传动领域,成为产业升级的关键。新能源汽车制造领域:…

医疗 AI 的 “破圈” 时刻:辅助诊断、药物研发、慢病管理,哪些场景已落地见效?

一、引言在科技迅猛发展的当下,医疗领域正经历着深刻变革,人工智能(AI)技术宛如一颗璀璨新星,强势 “破圈” 闯入,为医疗行业带来了前所未有的机遇与活力。从辅助医生精准诊断病情,到助力药企高…

【项目思维】编程思维学习路线(推荐)

本篇博客是一份系统性、分阶段的 编程思维学习路线图推荐,从零基础小白到系统架构级别,帮助你全面建立和提升编程思维能力。 🚦 阶段 0:思维准备(理解编程是什么) 🎯 学习目标: 理…

vue3+antd实现华为云OBS文件拖拽上传详解

1、文件上传核心流程 选择文件​​:用户通过拖拽或点击选择文件手动触发上传​​:点击"确定"按钮后开始上传(阻止自动上传)​​获取上传凭证​​:从后端获取华为云OBS的上传配置构建表单数据​​&#xff1…

Mac 开发环境与配置操作速查表

Mac 开发环境与配置操作速查表 安装和配置 nvm / Node 安装 Homebrew Homebrew 安装参考文章 如果没有VPN,不要使用此命令安装! /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew --v…

【论文简读】MuGS

今天读一篇ICCV 2025的文章,关注的是Generalizable Gaussian Splatting,作者来自华中科技大学。 文章链接:arxiv 代码仓库:https://github.com/EuclidLou/MuGS(摘要中的链接,但暂时404) 文章目…

基于SpringBoot和百度人脸识别API开发的保安门禁系统

角色: 管理员、保安 技术: Spring Boot, MyBatis, MySQL, PageHelper, Bootstrap, jQuery, JavaScript, CSS3, HTML5, JSP, 百度人脸识别API 核心功能: 小区保安门禁系统是一个基于Spring Boot技术栈开发的综合性平台,旨在实现小区…

抖音电商首创最严珠宝玉石质检体系,推动行业规范与消费扩容

8月27日,“抖音电商开放日质检专场”活动在广州华林国际举行。活动上,抖音电商首次对外介绍了质检仓配一体化中心(QIC)的运作流程,并发布了服务升级计划。这一行业首创的“先鉴定后发货”模式,被认为推动了…

SpringBoot整合Spring WebFlux弃用自带的logback,使用log4j2,并启动异步日志处理

第一步&#xff1a;修改pom文件<!-- Spring Boot Starter WebFlux (排除默认日志) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>${spring-boot.vers…

理解虚拟 DOM:前端开发中的高效渲染利器

在前端开发中&#xff0c;我们经常听到 虚拟 DOM&#xff08;Virtual DOM&#xff09; 这个概念。它是 React、Vue 等框架的核心机制之一&#xff0c;用来提升性能和简化开发。那么&#xff0c;虚拟 DOM 到底是什么&#xff1f;为什么要用它&#xff1f;又是如何工作的呢&#…

GraphRAG数据可视化

GraphRAG数据可视化

vue/react项目如何跳转到一个已经写好的html页面

如果是一个你copy的别人的网站&#xff0c;某些页面是已经可以直接使用的&#xff0c;但是有些页面需要在vue/react项目中重新二次调整加工&#xff0c;这个时候&#xff0c;就需要将html文件和vue/react项目结合&#xff0c;当某些页面可以直接使用&#xff0c;就直接跳转到这…

MYSQL-表的约束(下)

目录 自增长 唯一键 外键 自增长 MySQL自增长&#xff08;Auto-Increment&#xff09; 是一种字段属性&#xff0c;用于为表中的记录自动生成唯一的连续整数&#xff0c;常作为主键或唯一标识字段使用&#xff0c;避免手动输入重复值。 核心特性 1. 自动赋值&#xff1a…

《UE5_C++多人TPS完整教程》学习笔记44 ——《P45 倾斜与侧向移动(Leaning And Strafing)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P45 倾斜与侧向移动&#xff08;Leaning And Strafing&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

使用docker搭建嵌入式Linux开发环境

文章目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言 在日常开发全志、rk等不同平台时&#xff0c;大多数时候只有一个编译主机&#xff0c;但不同sdk所需要的编译环境可能不同。所以本文将记录使用docker为每个平台创建独立的开发环境。 2、安装docker # 1…

【开题答辩全过程】以基于Android的校园跳蚤市场交易系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

【学习笔记】GB 42250-2022标准解析

随着数字化转型的加速推进和网络安全威胁的日益复杂化&#xff0c;网络安全专用产品作为保护关键信息基础设施的第一道防线&#xff0c;其安全性和可靠性受到国家的高度重视。GB 42250-2022《信息安全技术 网络安全专用产品安全技术要求》作为一项强制性国家标准&#xff0c;于…

QML开发踩坑记:从MVVM到QWidget的挣扎

如题&#xff1a;最近这一周在开发的时候被qml不友好的前端框架打败了。首先&#xff0c;我没深入&#xff08;系统的&#xff09;学习过前端的内容&#xff0c;就是在学习Qt的时候了解到了qwidget&#xff0c;后来发现美化不太足的样子&#xff0c;外加AI十分推崇基于QML的MVV…

[Mysql数据库] 知识点总结5

1. 什么是“最少权限原则”&#xff1f;答&#xff1a;应用最少权限原则就是仅为用户授予高效地完成任务所需的权限&#xff0c;除此之外的任何权限均不能授 予&#xff0c;这可以降低用户修改或查看&#xff08;无意或恶意&#xff09;他们无权修改或查看的数据的机率&#xf…