【MySQL】 InnoDB

news2024/11/27 7:43:15

学习笔记,来源黑马程序员MySQL教程

文章目录

  • 逻辑存储结构
  • 架构
    • 内存架构
    • 磁盘结构
    • 后台线程
  • 事务原理
    • 概述
    • redo log
    • undo log
  • MVCC
    • 基本概念
    • 实现原理
      • 1、隐藏字段
      • 2、undo log
      • 3、readview
  • 总结

逻辑存储结构

在这里插入图片描述

  • 一个表空间对应一张表
  • 对应B+树上一个 节点
  • Trx id:最后一次使用的id

在这里插入图片描述

架构

在这里插入图片描述

内存架构

在这里插入图片描述

  • 假设没有缓冲区,执行增删改查的时候,每一次数据库都要去操作磁盘空间,就会引起大量的磁盘IO(在业务比较复杂的系统中,大概率是随机IO),性能极低。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • Buffer Pool:缓冲池,池中存放的最小单位是页
  • Change Buffer:更改缓冲区,针对非唯一的二级索引
  • MySQL服务器通常会将80%的内存分配给缓冲区,以提高执行效率

磁盘结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 当事务提交后,redo log的意义就不大了,它是用来保证出现异常时做数据恢复(持久性)。

后台线程

在这里插入图片描述

  • AIO:异步非阻塞IO,提高性能
  • 业务操作时,会操作整块缓冲区,如果缓冲区没有数据,将磁盘数据加载到缓冲区中,然后进行增删改查。缓冲区会以一定频率通过后台线程刷新到磁盘空间,之后在磁盘空间进行永久化保存。

事务原理

概述

在这里插入图片描述
在这里插入图片描述

redo log

  • 脏页:数据已经被修改过的页,但还没有刷新到磁盘中;

  • 在没有使用redo log的时候,产生脏页通过后台线程以一定时机刷新到磁盘中,有可能出错,此时就无法保证数据的持久性,如下图:在这里插入图片描述

  • 在用到redo log时,首先将增删改的数据记录到 redolog buffer 上 ,当事务提交时,就将该变化的页记录到磁盘上的日志文件(redo log file)中。

  • 如果缓冲池刷新到磁盘上出问题,就可以通过redo 日志文件进行恢复。

Q:为什么不在每一次事务提交的时候就将buffer pool的数据刷新到磁盘中?
A:存在严重的性能问题,事务中的每一个操作都是随机地操作记录,会涉及到大量地随机磁盘IO,而redo log 只刷新日志文件(以追加的方式,是顺序磁盘IO),性能高于随机磁盘IO。
WAL(write-ahead-logging)
在这里插入图片描述

  • 当脏页的数据顺利地刷新到磁盘当中,此时redo log当中记录的日志文件也就不需要了,所以每隔一段时间就会清理redo 日志文件,所以ib_logfile0/1 是循环写的,不会永久保存。

undo log

在这里插入图片描述

MVCC

基本概念

InnoDB默认隔离级别是可重复读,所以当一个事务未提交前,查询到的结果都是相同的,而有可能同一时间其他事务已经将数据修改过,所以第一个事务读取到的数据实际上已经是错误的,这就是快照读。

在这里插入图片描述

实现原理

1、隐藏字段

在这里插入图片描述

-- 查看stu表的表结构
ibd2sdi stu.ibd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、undo log

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、readview

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RC隔离级别下,根据readview读取到的记录。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 一致性:事务在执行之前和执行之后是一致的,那么操作如果执行失败,则全部回滚,执行成功则必须更新,而回滚由undo log、更新由redo log管理

总结

在这里插入图片描述

  • 表空间:包含独占表空间、系统表空间、通用表空间
  • 一个区1M、一个页16K,所以一个区包含64个连续的页,InnoDB引擎分配空间时一次性申请4-5个区,以保证页的连续
  • MVCC:在快照读的时候根据MVCC查找历史版本

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

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

相关文章

Git cat命令的用法

cat (全称 concatenate) 命令是 Linux/类 Unix 操作系统中最常用的命令之一。cat 命令允许我们创建单个或多个文件、查看文件内容、连接文件和重定向终端或文件中的输出。 语法: cat [OPTION] [FILE]...1.终端查看一个文件内容 cat file01.txt2.终端查看多个文件…

熵、信息量、条件熵、联合熵、互信息简单介绍

熵、信息量、条件熵、联合熵、互信息简单介绍 近期在看对比学习论文,发现有不少方法使用了互信息这种方式进行约束,故在此整理一下网上查阅到的关于互信息的相关内容。 一、熵、信息量 关于熵的讨论,这个知乎专栏写的挺不错的。 熵在信息论…

【更新日志】填鸭表单TduckPro v5.1 更新

hi,各位Tducker小伙伴。 填鸭表单pro迎来了v5.1版本;本次我们进行了许多的功能新增和优化,能够让我们在日常使用中获得更好的体验。 让我们一起来康康新功能吧。 01 新增Pro功能 新增登录后才能填写表单。 新增表单卡片一键发布。 新增矩…

【C++学习】CC++内存管理

目录 一、C&C内存管理 二、C语言中动态内存管理方式:malloc/calloc/realloc/free 三、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作符自定义类型 四、operator new与operator delete函数 4.1 operator new与operator delete函数&#x…

【云原生】使用外网Rancher2.5.12在阿里云自建内网K8s 1.20集群

目录 一、目标二、解决方案三、草图四、版本信息五、资源规划六、必要条件七、开始部署1、安装Docker2、安装Rancher3、解析Rancher Server URL域名4、创建K8s集群5、注册K8s集群节点 八、验证 一、目标 在云平台搭建一套高可用的K8s集群 二、解决方案 第一种:使…

横向移动-利用IPC$

环境主机 本次都是在内网自己搭的靶机实验 上线主机:windows2008R2 - 192.168.31.46 需要移动到的主机:windows2012 - 192.168.31.45 实验演示 1.确定域控 通过命令net time /domain,发现存在域 这里我们通过ping来发现域控的ip,…

UGUI Scroll Rect滚动矩形组件

1、概述 当需要在小区域显示占用大量空间的内容时,可以使用Scroll Rect。滚动矩形提供了滚动浏览此内容的功能。 通常,将Scroll Rect与Mask结合在一起以创建滚动视图,在该视图中,只有Scroll Rect内部的可滚动内容可见。它也可以…

类和对象【1】

全文目录 引言(初识面向对象)类和对象定义类访问限定及封装类定义的两种方式 类实例化与类对象大小this指针 总结 引言(初识面向对象) C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通…

NSSCTF之Misc篇刷题记录⑩

NSSCTF之Misc篇刷题记录⑩ [CISCN 2022 初赛]ez_usb[SWPUCTF 2021 新生赛]你喜欢osu吗?[SWPUCTF 2021 新生赛]Bill[SWPUCTF 2021 新生赛]二维码不止有二维码[HGAME 2022 week1]好康的流量[红明谷CTF 2022]MissingFile[广东省大学生攻防大赛 2021]这是道签到题[羊城杯…

TOGAF架构开发方法—阶段 F:迁移规划

本章介绍迁移规划;也就是说,如何通过最终确定一个 详细的实施和迁移计划。 一、目标 F阶段的目标是: 最终确定架构路线图以及支持实施和迁移计划确保实施和迁移计划与企业的管理和实施方法相协调 企业整体变更组合的变化确保关键利益相关者了解工作包和…

【什么是蜂窝移动网络】

从 DataReportal 2021 年 1 月的统计数据来看,全球 78 亿人口中,有 52 亿手机用户,46 亿互联网用户。能够接入网络的设备越来越多,体量越来越大,不知道你有没有好奇过,这样一个庞大的世界是如何被构造出来的…

【Linux】指令(下)

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:Linux ⭐代码仓库:Linux 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

论文阅读:Multimodal Graph Transformer for Multimodal Question Answering

文章目录 论文链接摘要1 contribution3 Multimodal Graph Transformer3.1 Background on Transformers3.2 Framework overview 框架概述3.3 Multimodal graph construction多模态图的构建Text graphSemantic graphDense region graph Graph-involved quasi-attention 总结 论文…

【AIGC提示工程 - MidJourney教程:一】“Midjourney AI“是什么,为何众人皆谈?

关注元壤教育公众号系统学习AIGC提示工程课程。 更多AIGC好博客,请移步访问AIGC博客派 Midjourney AI是一个极富创造性的工具,它能够帮助用户通过指令创建图像。这些图像是基于用户的想象力而创造的。 在本文中,我们将详细了解Midjourney AI。…

软件测试面试面对史上最难求职季,会哪些测试技能更容易拿到offer?

在一线大厂,没有测试这个岗位,只有测开这个岗位。这几年,各互联网大厂技术高速更新迭代,软件测试行业也 如果你在中小型公司,普通的测试工程师20K差不多到极限了,薪资想再进一步提升很困难。而在阿里巴巴P…

【AIGC提示工程 - MidJourney教程:二】《MidJourney参数大全指南:实现最佳图像输出的关键》

关注元壤教育公众号系统学习AIGC提示工程课程。 更多AIGC好博客,请移步访问AIGC博客派 这篇文章介绍了不同的MidJourney参数和提示词,帮助你创建你选择的图像。探索如何使用不同的风格和参数进行操作。 如果你使用Midjourney应用,你就知道提示…

NetSuite SuiteQL 内建函数

之前写过一篇文章介绍SutieQL Query Tool,今天继续挖掘一下SuiteQL的价值。 NetSuite SuiteQL Query Tool_netsuite好用吗_毛岩喆的博客-CSDN博客这是一个非常好的NetSuite数据查询工具,免费、强大!所以忍不住安利给大家。首先介绍一下背景&…

Redis系列--redis持久化

一、为什么需要持久化 redis本身运行时数据保存在内存中,如果不进行持久化,那么在redis出现非正常原因宕机或者关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。当然,redis本身默认采用了一种持久化方式,即RD…

11.Kafka系列之Stream实践

Kafka Streams是一个基于Apache Kafka的处理库,可以用于实现高效、可扩展的实时数据处理应用程序。它是一个轻量级的库,允许你在Java和Scala中创建和运行流处理应用程序,这些应用程序可以读取输入流,执行各种数据转换,…

MyBatis的配置案例

Mybatis中Map的使用 如果需要所有的代码&#xff0c;可以看我上一篇 在接口中定义 int addUser1(Map<String,Object> map); 插入语句 <insert id"addUser1">insert into user(id,name,pwd) values (#{userid},#{username},#{userPwd})</insert> …