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.mzph.cn/news/633012.shtml

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

相关文章

HR3D+HRAuido+HRUI+HR3D_Plugins(游戏引擎源码)

国内知名游戏公司开发的游戏引擎,简洁高效,代码值得参考。包含了这几部分:HR3DHRAuidoHRUIHR3D_Plugins HR3DHRAuidoHRUIHR3D_Plugins(游戏引擎源码) 下载地址: 链接:https://pan.baidu.com/s/1…

使用Apache Spark处理Excel文件的简易指南

前言 在日常的工作中,表格内的工具是非常方便的x,但是当表格变得非常多的时候,就需要一些特定的处理。Excel作为功能强大的数据处理软件,广泛应用于各行各业,从企业管理到数据分析,可谓无处不在。然而&…

使用xbindkeys设置鼠标侧键

1.安装如下包 sudo apt install xbindkeys xautomation 2.生成配置文件 xbindkeys --defaults > $HOME/.xbindkeysrc 3.确定侧键键号 在终端执行下面的代码: xev | grep button 此时会出现如下窗口,将鼠标指针移动到这个窗口上: 单…

如何应对利用加密隧道发起的网络攻击?

日前,网络安全公司Zscaler的 ThreatLabz研究团队编写发布了《2023年加密攻击态势调查报告》,报告数据显示,目前85.9%的网络威胁是通过加密通道发起的,包括恶意软件、数据窃取和网络钓鱼攻击。更重要的是,许多加密攻击使…

【机器学习】调配师:咖啡的完美预测

有一天,小明带着一脸期待找到了你这位数据分析大师。他掏出手机,屏幕上展示着一份详尽的Excel表格。“看,这是我咖啡店过去一年的数据。”他滑动着屏幕,“每个月的销售量、广告投入,还有当月的气温,我都记录…

【MYSQL】事务隔离级别

脏读、幻读、不可重复读 脏读 一个事务正在对一条记录做修改,在这个事务完成并提交前,另一个事务也来读取同一条记录,读取了这些未提交的“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形…

APP跳转系统相机拍照和拍摄

拍照和拍摄功能&#xff0c;我们项目用得不多。最近在做&#xff0c;记录哈。 都是调用的手机自带的。 具体代码如下&#xff0c;可以结合《vue<input>标签调用 Android的获取文件》一起理解哈&#xff1b; private static Uri imageUri; private static Uri VedioUri;…

User电脑中睡眠和休眠的区别,及对不同环境下模式设置建议

睡眠模式&#xff08;Sleep&#xff09;&#xff1a; 特点&#xff1a; 电脑进入睡眠模式时&#xff0c;系统的状态会保存在RAM中&#xff0c;电脑的大部分组件都会被关闭&#xff0c;但RAM仍然得到电源供应以保持数据。这使得电脑能够快速唤醒&#xff0c;因为数据保持在内存中…

【控制篇 / 分流】(7.4) ❀ 01. 对指定IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带&#xff0c;一条ADSL拨号用来上网&#xff0c;一条移动SDWAN&#xff0c;已经连通总部内网服务器&#xff0c;领导要求&#xff0c;只有访问公司服务器IP时走移动SDWAN&#xff0c;其它访问都走ADSL拨号&#xff0c;如果你是管理员&#xff0c;你知道有…

自定义 React Hooks:编写高效、整洁和可重用代码的秘密武器

欢迎来到神奇的 React 世界 大家好!在 React 的世界中,有一个强大的秘密武器,它往往隐藏在显而易见的地方,由于缺乏理解或熟悉而没有得到充分利用。 这个强大的工具,被称为自定义 React hooks,可以彻底改变我们编写 React 应用程序代码的方式。通过提取组件中的有状态逻辑,自…

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…

《Python数据分析技术栈》第02章 01 容器(Containers)

01 容器&#xff08;Containers&#xff09; 《Python数据分析技术栈》第02章 01 容器&#xff08;Containers&#xff09; In the previous chapter, we saw that a variable could have a data type like int, float, str, and so on, but holds only a single value. Cont…

【Emgu CV教程】5.5、几何变换之Remap()重映射

重映射的意思就是把原始图像中某位置的像素放置到目标图像指定位置的过程&#xff0c;在Emgu CV中&#xff0c;Remap()重映射函数可以实现图像的缩放、翻转等操作&#xff0c;函数定义如下&#xff1a; public static void Remap(IInputArray src, // 输入图像IOutputArray d…

WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除?

不知道各位WordPress站长在后台操作时&#xff0c;是否有注意到每一个页面底部左侧都有一个“感谢使用 WordPress 进行创作。”&#xff0c;其中WordPress还是带有nofollow标签的链接&#xff1b;而页面底部右侧都有一个WordPress版本号&#xff0c;如下图中的“6.4.2 版本”。…

Python 3 列表数据类型基本用法

介绍 列表 是 Python 中的一种数据结构&#xff0c;是一个可变、有序的元素序列。列表中的每个元素或值被称为一个项。就像字符串是在引号之间定义的字符一样&#xff0c;列表是通过在方括号 [ ] 之间放置值来定义的。 列表非常适合在需要处理许多相关值时使用。它们使您能够…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组&#xff0c;乘法器最重要的设计是改变部分积的数量&#xff0c;另外在考虑有符号数的情况下&#xff0c;最高位符号位有特别的意义。 &#xff08;注&#xff1a;部分积是指需要最后一起加和的所有部分…

js实例继承的例子和优缺点

构造继承是一种继承方式&#xff0c;通过使用构造函数来实现继承。在JavaScript中&#xff0c;构造继承是最早的继承方式之一&#xff0c;但随着ES6引入了类和基于类的继承方式&#xff0c;构造继承的应用逐渐减少。 构造继承的优点&#xff1a; 简单易用&#xff1a;构造继承…

使用的uview 微信高版本 头像昵称填写能力

<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…

关于C#中的async/await的理解

1. 使用async标记的方法被认为是一个异步方法&#xff0c;如果不使用await关键字&#xff0c;调用跟普通方法没有区别 static async Task Main(string[] args){Console.WriteLine("主线程id&#xff1a;" Thread.CurrentThread.ManagedThreadId);TestAwait();Consol…