innoDB存储引擎

1.逻辑存储结构

行数据->行->页->区->段->表空间

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

段:分为数据段和索引段,回滚段,数据段就是B+树的叶子节点,索引段时B+树的非叶子节点,段用来管理多个extent区。

区:每个区大小是1m,默认下一个页的大小是16k,即一个区有64个连续的页。

页:存储磁盘管理的最小单元,为了保证页的连续性,每次innoDB都会向磁盘申请4-5个区

行:innoDB存储引擎是按行进行存放的

2.架构

innoDB在mysql5.5之后作为默认存储引擎,具有崩溃恢复特性

内存结构

(1)buffer pool:内存中的一个区域,保存磁盘经常操作的真实数据,执行crud时,先操作缓冲池的数据(若缓冲池没有数据,则从磁盘加载并缓存)然后再按一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。

缓冲池以页为单位,其中的页分为

free page,空闲页,未被使用

clean page,被使用页数据但未被修改

dirty page,脏页,被使用且数据被修改,与磁盘上数据产生不一致

(2)change buffer:更改缓冲区(针对于非唯一二级索引页),即对唯一索引不支持,在执行DML语句时,如果数据不在buffer pool中,不会直接操作磁盘,会把数据变更保存在更改缓冲区里,当数据在未来被读取时,再合并数据恢复到buffer pool中,然后再刷新到磁盘上

(3)Adaptive hash index:自适应哈希索引,优化对buffer pool数据的查询,如果观察到使用hash索引可以提高速度,则会建立hash索引,无需人工干预

(4)log buffer:日志缓冲区,默认大小为16mb,该缓冲区的日志会定期刷新到磁盘,需要更新,插入,删除多行事务时,可以提高日志缓冲区的大小,来节约磁盘IO

磁盘结构

(1)system tablespace:系统表空间是更改缓冲区的存储区域,如果表是在系统表空间文件或通用表空间创建的,它也可能包含表和索引数据

(2)file-per-table-tablespaces:每个表的表空间文件(ibd)包含单个innoDB表的数据和索引,并存储在文件系统上的单个数据文件里

(3)general tablespaces:通用表空间,需要手动create tablespace来创建

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

(5)temporary tablespaces:临时表空间,用于存储用户定义的临时表数据

(6)doublewrite buffer files:双写缓冲区,从buffer pool刷新到磁盘时,会先写入到双写缓冲区中,便于系统异常时恢复数据

(7)redo log:重做日志,实现事务的持久性,由重做日志缓冲区和重做日志文件构成,前者在内存中,后者在磁盘中,事务提交时会把所有的修改信息都存到该日志,用于以后再刷新脏页到磁盘,发生错误时,进行数据恢复,每隔一段时间redo log会自动清理

(8)后台线程:

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

io thread:异步io

purge thread:回收事务已提交的undo log 

page cleaner thread:协助核心线程刷新脏页到磁盘,减轻核心线程负担

3.事务原理

redo log

undo log

undo  log 版本链

假设有以下四个事务同时开始,事务2修改后,将trx_id设为2,roll_pointer设置1

事务3更新时,trx_id设为3,rollpointer指向2,依次这样,形成一个链表,链表的头部是最新的旧记录,尾部是最旧的旧记录,即undo log 版本链

MVCC:多版本并发控制,即维护一个数据的多个版本,使得读写操作没有冲突

MVCC的实现原理:隐藏字段,undo log版本链,readview

readview,读视图是快照读的依据,记录并维护系统当前活跃事务的id

不同的隔离级别,生成readview的时机不同

RC下:事务每一次执行快照读都会生成readview,以事务5的两次读操作为例,第一次快照读中,事务2以提交,活动事务id为3,4,5,最小事务id = 3,预分配事务id = 最大事务id +1 = 6,创建事务id = 5.第二次快照读中,事务2,事务3以提交,活动事务id = 4,5,最小事务id = 4 ,预分配事务id = 6,创建事务id =5

则按照根据版本链从最新的记录id开始匹配,可得,第一次快照读,读取的是事务2已提交的数据,第二次快照读,读取的是事务3提交的数据

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

即两次快照读,读取的都是事务2提交的数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块,但是yakit也是可以爆破的,并且更好用(个人感觉)。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

Gazebo的模型下载。

git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git,并完成路径配置。 (本文提供了gitee下载,国外的Github下载较慢。)

《WebKit 技术内幕》之四(1): 资源加载和网络栈

第四章 资源加载和网络栈 使用网络栈来下载网页和网页资源是渲染引擎工作的第一步 1.WebKit 资源加载机制 1.1 资源 网页本身就是一种资源、网页还需要依赖很多其他的资源(图片、视频) (1)HTML 支持的资源主要包括以下几种类型: HTML 页…

【并发编程系列】putIfAbsent和getOrDefault用法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

高效火情监测,科技助力森林防火【数字地球开放平台】

数字地球开放平台-以卫星遥感为核心的空天信息服务开放平台 (geovisearth.com) 2019年3月30日,四川省凉山州木里县爆发了一场森林火灾,火点位于海拔3800米左右,地形险峻、坡度陡峭、谷深难以抵挡火势。在扑救的过程中,27名森林消防…

服务器自动拉取git代码运行脚本

# 1.场景分析 工作中常常会遇到本地编辑shell脚本或者python脚本完成后需要在服务器上运行的情况,每次进行拷贝费时费力。下面介绍下通过git管理器,实现本地与服务器代码同步的方式。选择公司搭建的gitlab为例: 2.gitlab配置服务器ssh密钥 …

【陈老板赠书活动 - 22期】- 人工智能(第三版)

陈老老老板🧙‍♂️ 👮‍♂️本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 🤴本文简述:活就像海洋,只有意志坚强的人,才能到达彼岸。 👳‍♂️上一篇文章&#xff…

shopee西班牙站选品:如何在Shopee西班牙站点上进行选品策略

在Shopee西班牙站点进行选品时,卖家需要考虑一系列策略,以确保产品符合当地市场需求并取得良好的销售业绩。以下是一些关键策略,卖家可以参考并应用到自己的选品过程中。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff0…

数据中心设备与线缆数据采集神器

​前言 在数据中心机房运维管理过程中,开展以下工作时通常我们采用手工表格的方式,效率低还容易出错,如: 数据中心机柜设备与线缆规划; 数据中心机柜设备与线缆变更记录; 数据中心机柜内设备与线缆数据采…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是,一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段,要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务,但不能访问 FTP 服务 【操作步骤】 {易混点 }:1. …

小扎宣布进军AGI!Meta正在训练Llama 3,目标是60万块H100!模型仍会开源

今日,扎克伯格在Instagram上通过一则视频官宣,Meta要进军AGI了! 扎克伯格认定Meta的长期愿景是构建通用智能,将其负责任地开源,使其广泛可用并造福全人类,扎克伯格还透露了以下几点信息: 1、将…

探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧&#xf…

2024Java零基础自学路线(Java基础、Java高并发、MySQL、Spring、Redis、设计模式、Spring Cloud)

目录 一、Java基础1、Java 基础3、Java8新特性4、Java集合5、Java高并发6、Java代码实例 二、MySQL数据库三、Spring Boot框架(35天)四、微服务Spring Cloud四、Redis中间件五、MongoDB数据库六、Netty网络编程七、23种设计模式八、Dubbo九、JavaScript零…

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器 注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(W…

Git学习笔记(第2章):Git安装

官网地址:Githttps://git-scm.com/ Step1:查看Git的GNU协议 → 点击“Next” Step2:设置Git的安装位置(非中文、无空格的目录) → 点击“Next” Step3:选择Git的选项配置(推荐默认设置) → 点击“Next” Step4:设置Git…

MySQL复合查询解析

🎈行百里者半九十🎈 🎈目录🎈 概念多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询在from中使用子查询合并查询unionunion all 总结 概念 之前我们很多的查询都只是对于单表进行查询&#xff0c…

vue3-表单输入绑定

表单输入绑定 获取表单输入的值方式&#xff1a; 手动连接值绑定和更改事件监听器 v-model 指令 &#xff08;常用&#xff09; <script lang"ts" setup> import { ref } from "vue" // 定义个变量接收输入的内容&#xff1a; const text ref(&…

源码:Spring常规Bean创建过程

Bean创建过程&#xff1a; 一、版本 5.3.10二、学习内容 Bean创建过程源码三、Bean生命周期 时间轴地址&#xff1a;点击 四、bean创建过程脑图总结 脑图地址&#xff1a;点击 五、源码过程 说明&#xff1a; bean创建入口一般都是通过getBean(xxx);方法进入的&#xf…

关于php8的数据类型转换

目录 1、数据类型介绍 1.1 简单数据类型&#xff1a; 1.2 复合数据类型&#xff1a; 1.3 特殊数据类型&#xff1a; 2、数据类型转换 2.1 自动转换&#xff1a; 2.2 强制&#xff08;手动&#xff09;转换&#xff1a; 3、验证数据类型途径 &#xff08;1&#xff09;var…
最新文章