Inodb引擎 内存+磁盘+MVCC(多版本并发控制)

news2024/11/18 20:22:56

目录

逻辑存储结构

 Innodb引擎内存结构介绍

  Innodb引擎磁盘结构介绍

内存和磁盘交互

 MVCC(多版本并发控制)原理

预备知识

 mvcc基本概念

mvcc的具体实现

 总的来说mvcc原理:


逻辑存储结构

 

 Innodb引擎内存结构介绍

Buffer Pool(缓冲池)

缓冲池是内存的一个区域,可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池的数据(若缓冲池内部没有数据,再从磁盘加载到内存),然后以一定频率刷新到磁盘,从而减少磁盘io,加快处理速度,缓冲池管理的单位是页,底层通过链表管理页,页可以分为:free page,clean page,dirty page(缓冲池数据改了,但磁盘还未刷新(磁盘中的数据没有改变)--脏页)。

 Change Buffer (更改缓冲区)

mysql8.0之后将insert buffer更改为change buffer

针对的是非唯一二级索引页放在这个区管理,执行DML语句时,如果数据没有在缓冲池中,那么不会直接操作磁盘,而会将数据变更存放在 Change Buffer 中,当数据被用户读取了才将数据回复到缓冲池中,再刷新磁盘

 Change Buffer 的意义是 如果我们先将 Change Buffer 的数据合并到缓冲池中,再将缓冲池中数据刷新到磁盘,这样的话如果用户多次执行DML,且每次插入的位置随机,把多个DML语句的执行结果先放在一个区域而不是执行一条刷新一次磁盘,能节省大量磁盘io。

Adaptive Hash Index (自适应哈希索引)

innodb默认支持的是B+树索引,默认不支持hash索引,hash索引一般匹配一次(缺点:不适应范围查询,只能等值查询),B+树索引一般匹配两三次,自适应hash系统默认开启的,不用手动

通过查询系统变量“%hash_index%”可以看到

Log Buffer(日志缓冲区)

日志缓冲区用来保存要写入到磁盘的数据的日志,日志缓冲区会定期刷新到磁盘中,如果需要操作失误,增加日志缓冲区大小可以节省磁盘i/o

  Innodb引擎磁盘结构介绍

System Tablespace(系统表空间)

File-Per-Table tablespaces(单表的表文件空间)

每个表会对应一个.ibd,.ibd是表空间文件,存放表的数据和索引,,通用表空间general tablespaces,

General Tablespaces(总体的表文件空间)

创建表空间语句:create tablespaces 表空间名 add datafile ‘表名.ibd’ engine=innodb

建表时要关联指定的表空间:create table 表名(字段,字段类型)engine=innodb tablespaces 表空间名

Undo Tablespaces(撤销的表文件空间)

Mysql实例在初始化时自动创建两个默认的undo表空间,用于存储undo log日志,在MySQL5.6之前所有的undo log全部存储在系统表空间中(ibdata1);但是从5.6开始也可以使用独立表空间来存储undo log。

Temporary Tablespaces(临时的表文件空间):存储用户临时创建的临时表数据

Doublewrite Buffer Files(双写缓冲区),innodb引擎将数据也从缓冲池刷新到磁盘前,会先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据

Redo Log(重做日志):用来实现事务的持久性,这个区域由日志缓冲和重做日志文件组成,前者在内存中,后者在磁盘中,当事务提交之后把所有信息都会保存到这个日志中,用于如果在刷新脏页到磁盘中发生错误时,进行数据恢复,,每隔一段时间系统会清理redo log文件,

虽然也可以直接将内存中脏页的数据刷新到磁盘中,但存在严重的性能问题,因为是实时刷新的,而如果先保存日志,让redo log通过顺序磁盘刷新到磁盘,那么不会影响性能。

 ,查看innodb引擎状态:show engine innodb status

内存和磁盘交互

磁盘与内存间会通过多个线程交互

如何交互?原理?

后台线程:实现内存和磁盘间的交流,后台线程

Master Thread:核心后台线程,负责将内存中缓冲池的数据异步刷新到磁盘中,保证数据的一致性,还包括脏页的刷新,合并插入缓冲,undo页的回收

IO Thread:在Innodb存储引擎中使用了大量的AIO(Async IO异步io)来处理IO请求,这样就可以极大地提高数据库的性能,而IO线程主要是负责IO请求的回调

Purge Thread:事务提交后就持久化存储了,可能不需要undo log了,因此需要purge线程回收undo log

Page Cleaner Thread:协助Master Thread刷新脏页数据到磁盘的线程,可以减轻Master Thread的压力,减少阻塞,page cleanner thread 是唯一能够在 LRU List(块缓冲区高速缓存在内存的缓冲区中) 中进行脏页刷新并释放出新的 free page 的线程

 MVCC(多版本并发控制)原理

预备知识

mvcc保证的是事务的隔离性,在前面的redo log和undo log保证事务的原子性,一致性,持久性undo log在前面内存的Undo Tablespaces中,它的作用是记录数据被修改前的信息,作用包含两个:提供回滚和MVCC,undo log的销毁:undo log在事务执行时产生,在事务提交后并不会马上销毁,因为这些undo log可能在不同客户端开启事务时需要用到;
 

 mvcc基本概念

当前读的概念:

在innodb中,客户端我们默认的隔离级别是RR是可重复读,因此就算一个事务提交后另一个事务也查询不到前者事务更新的的数据,后者事务只有通过加共享锁查询才能读取到,

原因是RR隔离级别下,读取的是第一次执行查询语句生成快照的信息,下一次执行查询语句读取的是上一个快照,因此本质读的信息都是相同的。

演示:

快照读概念:

简单的不加锁的select是快照读,快照读记录的是可见数据版本,有可能是历史版本而不是最新的,不加锁不存在阻塞问题

mvcc的具体实现

需要用到数据库的3个隐式字段,undo log 和readview

3个隐式字段

分别是DB_TRX_ID, DB_ROLL_PTR, DB_ROW_ID

 测试这三个东西是否存在于数据库?1.cd var/lib/mysql ;2. cd 数据库名; 可以看到很多表空间文件.ibd  3. ibd2sdi 表名.ibd  ;这条语句是专门来查看ibd文件的

undo log版本链

展示的当前事务是事务3,执行事务时候当前DB_TRX_ID=3,DB_ROLL_PTR指向上一条记录的地址

 

readview

一次快照读生成一次readview,包含4个核心字段:m_ids,min_trx_id,max_trx_id,

creator_trx_id

版本链访问规则:规范了事务查询时读取到的到底是哪个历史版本的数据,注意在不同隔离级别,生成快照图的时机也是不同的,RC级别commit一次事务生成一个快照,RR级别只在事务第一次执行时生成快照,后面的事务都会读取的时第一次事务生成的快照

 RC级别下的事务读取原理:

举例:

事务5查询id=30的记录读取到的是id=2的事务;

之后的事务5查询id=30的记录读取到的是id=3的事务,因为此时,的creator_trx_id=5,而DB_TRX_ID=3<5,满足第二条规则。(很容易理解因为我们注意到事务5在查询时其实其他事务也在操作)

 RR级别下事务读取原理:当前事务读取的都是第一次事务生成的快照,我理解的是无论除第一次事务外后面执行多少次事务读的都是最早的历史记录

 总的来说mvcc原理:

三大组件各自负责的内容

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

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

相关文章

001 hive简介

一. hive概述 1. hive的产生背景 mapreduce程序大部分解决的问题是结构化数据&#xff0c;而解决结构化数据最佳方案是一条sql语句 hive出现的主要原因是解决mapreduce开发成本高的问题。但hive不能完全替代mr&#xff0c;只能处理mr中的结构化数据。 2. hive是什么 hive提…

【数据结构】常见数据结构汇总

文章目录 前言一、数组二、链表三、栈四、队列五、哈希表--散列表六、堆七、树八、图参考与感谢 前言 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的&#xff0c;但是我们可以使用指针等道具&#xff0…

hive学习入门

第四章 HQL基础语法 Hive中的语句叫做HQL语句,是一种类似SQL的语句,基本上和SQL相同但是某些地方也是有很大的区别. 4.1 数据库操作 创建数据库 1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。 create database hive01; 避免要创建的数据库已经存…

算法设计与分析:分治法

目录 第1关&#xff1a;分治法介绍 任务描述&#xff1a; 相关知识&#xff1a; 基本概念&#xff1a; 解题步骤&#xff1a; 实例演示&#xff1a; 关键代码&#xff1a; 编程要求&#xff1a; 测试说明&#xff1a; 第2关&#xff1a;归并排序 任务描述&#xff1a;…

网安行业「iPhone时刻」!深信服首秀安全GPT技术应用

5月18日&#xff0c;深信服正式对外首秀安全GPT技术应用。深信服科技董事长何朝曦在现场分享了安全GPT技术应用的研发背景、技术应用特点及未来设想。深信服科技研发总经理梁景波、深信服安全攻防专家演示了安全GPT技术应用在XDR平台上的效果&#xff0c;包括高级威胁检测、安全…

Midjourney8种风格介绍+使用场景(2)

引言 我相信大家都或多或少玩过Midjourney&#xff0c;但是要形成自己独特的个人IP&#xff0c;那么有必要知晓画作的一些基础知识&#xff0c;如果你没有时间实践&#xff0c;没有关系&#xff0c;我来操作&#xff0c;定期分享画作相关知识&#xff0c;既简单又方便&#xff…

软件测试面试常常遇到的十大“套路”

面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的10个问题&#xff0c;告诉你怎么回答才不会被面试官套路...... 一、请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只说…

5th-Generation Mobile Communication Technology(四)

目录 一、5G/NR 1、 快速参考&#xff08;Quick Reference&#xff09; 2、5G Success 3、5G Challenges 4、Qualcomm Videos 二、PHY and Protocol 1、Frame Structure 2、Numerology 3、Waveform 4、Frequency Band 5、BWP 6、Synchronization 7、Beam Management 8、CSI Fra…

闭包?什么是闭包?--JavaScript前端

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 闭包的背景 由于js中只有两种作用域&#xff0c;全局作用域和函数作用域&#xff08;模块…

模拟封装C标准库

文章目录 1. 准备工作2. my_fopen3. my_fwrite4. my_fclose和my_fflush5. syncfs 1. 准备工作 举个例子&#xff1a; 这里我们要实现my_fopen&#xff0c;my_fwrite和my_fclose这三个函数&#xff0c;并封装MyFILE。 这是MyFILE的封装&#xff0c;然后我们把三个函数接口完成…

Seaborn 可视化学习

Abstract 主要讲述绘制强化学习结果时遇到的seaborn操作。因此&#xff0c;本文主要讲述Lineplot的用法&#xff0c;以及图片的相关设置 线条绘制 import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import numpy as np# 单线绘制 data pd.DataF…

接口测试全流程扫盲,让我看看有哪些漏网之鱼

目录 扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质及其工作原理是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f;…

蓝桥杯2020年第十一届省赛真题-回文日期python两种方法题解(贪心+datetime)

题目 原题链接&#xff1a;回文日期 - 蓝桥云课 (lanqiao.cn) 题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202&#xff0c;恰好是一个回文数。…

如何系统自学黑客(网络安全)?

前言&#xff1a; 黑客技能是一项非常复杂和专业的技能&#xff0c;需要广泛的计算机知识和网络安全知识。下面是一些你可以参考和学习的步骤&#xff0c;以系统自学黑客&#xff08;网络安全&#xff09;&#xff1a; 在学习之前&#xff0c;要给自己定一个目标或者思考一下…

SpringBoot日志配置(四十七)

当一切被遗忘&#xff0c;那么就回到最初的地方 上一章简单介绍了SpringBoot配置文件敏感信息加密(四十六) , 如果没有看过,请观看上一章 这一章节&#xff0c;我们学习一下日志配置. 参考文章: Spring Boot 日志配置(超详细) 一. 日志配置处理 我们创建一个普通的 SpringB…

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事…

excel根据不同分类动态设置不同下拉列列表

有这样一个需求&#xff0c;有很多个系统&#xff0c;需要在excel中下拉选择其系统一级分类、二级分类、三级分类&#xff0c;不同的一级分类对应不同的二级分类列表&#xff0c;不同的二级分类对应不同的三级分类列表。 针对这个需求&#xff0c;我们采用了excel/wps中的数据…

数据结构总结7:并查集、图

后续会有补充 并查集 查你在哪个集合&#xff0c;在有一定交集情况下会合并集合 可应用的场景&#xff1a; 1.分组 2.已有集合合并 并查集就是把一组数据分组&#xff0c;把有共同特征的元素以树的形式放在一组 仔细观察数组中内融化&#xff0c;可以得出以下结论&#x…

【数据结构和算法】数据结构基础和算法思想

文章目录 1. 基础的一些数据结构&#xff08;1&#xff09;数组&#xff08;2&#xff09;链表&#xff08;3&#xff09;二叉树&#xff08;4&#xff09;哈希表 2. 有哪些常见的算法思想&#xff1f;3. 常见排序算法及其复杂度 1. 基础的一些数据结构 &#xff08;1&#xf…

java多线程之定时器

文章目录 一、 简介1. 概念2. 定时器的使用 二、 常用方法介绍1. Schedule(TimTask task,Data time&#xff09;2. Schedule(TimTask task,Data firstTime, long period&#xff09;3. Schedule(TimTask task, long delay&#xff09;4. Schedule(TimTask task, long delay, lo…