【数据库】聊聊InnoDB存储引擎结构

在学习任何技术、框架、中间件的时候,我们都需要从一个宏观的角度先去了解一下大概视角,然后在通过剖定解牛的方式进行细分点的学习,同样对于任何存储结构来说,基本上都包含几块内容。
通信:解决信息传输问题、存储模型:是采用B+树、还是LSM等。高可用、高性能等。本篇主要从InnoDB切入,了解,一行数据在InnoDB中是如何存储的。

MySQL逻辑架构

在这里插入图片描述

InnoDB架构

从架构上可以看出,主要分的是内存结构和磁盘结构,内存结构其实就是在内存中存储数据的形式。
内存结构:缓冲池 (buffer pool、change buffer)、自适应哈希索引、日志缓冲
磁盘结构:系统表空间、独立表空间,通用表空间等
在这里插入图片描述

内存结构

buffer pool 缓冲池 主要用于加速数据的访问和修改。默认128M。减少磁盘IO,加速热点数据的读和写。通常有内存淘汰算法LRU。
change buffer : 加速非热点数据中二级索引的写入操作,修改会落入redo log中。定期进行marge。
自适应哈希索引:用于实现对热数据页的一次查询,建立在索引智商的索引。大小是 buffer pool的1/64。
Log buffer : 缓冲日志文件的写入操作,顺序写入。 buffer pool -> log buffer -> os buffer -> redo log

磁盘空间

上面简单描述了在内存中的结构,那么在磁盘中,是如何组织数据结构的。大多数的新手都会认为,数据库只存储数据和索引,其实不然,还存储表结构以及其他的缓存信息。而这个地方就是表空间。有段、区、页、行组成。

常见的表空间:
系统表空间:关闭独立表空间,所有表数据和索引都会存入系统表空间。
独立表空间:开启独立表空间,每张表都会写入独立表空间。
通用表空间:为了在系统表空间与独立表空间之间作出平衡

存储结构

在这里插入图片描述
段:表空间由多个段组成,数据段、索引段、回滚段。数据段是叶子结点,索引段是非叶子结点。
区:连续的页组成,大小是1MB,默认是64个页组成。
页:页是InnoDB的基本存储单位,默认是16K。操作系统读写磁盘的最小单位是页,4K。
行:数据以行为单位存储,一页包含多行。有不同的行格式、默认是Dynamic。

-- innodb的表空间类型 innodb_file_per_table=ON,这就意味着每张表都会单独保存为一个.ibd 文件
show variables like 'innodb_file_per_table';
-- 页大小
show variables like '%innodb_page_size%';

在这里插入图片描述

数据页结构

在这里插入图片描述
在这里插入图片描述
实际上我们进行划分为3部分。
文件通用部分: 文件头和文件尾。将页的内容进行封装,通过文件头和文件尾校验的方式来确保页传输是完整的。
文件头有两个字段,FIL_PAGE_PREV、FIL_PAGE_NEXT.他们的作用相当于指针,分别指向上一个数据页和下一个数据页。形成一个双向链表。
在这里插入图片描述
记录部分:主要作用是存储记录,第三部分基友说页目录,记录的是索引的记录,通过二分查找。
在这里插入图片描述

内存中的数据如何进入磁盘

在修改一条数据的时候,其实是先从磁盘获取数据或者从buffer pool中,然后写入 undo log、更新buffer pool数据,使用两阶段提交修改redo log\bin log。但是写入buffer pool中的数据以及redo log都是先写入内存中的,并没有写入磁盘。

为什么要这样设计?如何保证数据被持久化的?
在这里插入图片描述
脏页
当我们将数据更新到 buffer pool中,此时这个数据对应的页和磁盘中的页 数据不一致,那么就成为脏页。将更新的数据写入磁盘的过程,是通过checkPoint 机制实现的。

提升性能:内存中写,顺序写入日志,在批量写入磁盘
持久化数据:checkpoint 机制进行脏页落盘,日志先行,先写redo log、force Log at Commit
安全性保证:两阶段提交、WAL、check point机制,double write机制

为什么不直接写入磁盘

因为对于数据的操作,有很多的随机IO,而随机IO的性能是非常低。所以为了提升性能,采用顺序IO,也就是通过WAL 以及force Log at Commit 来保证数据可以有效持久化到磁盘。而redo log的同步磁盘策略,使用了3种不同的机制,需要我们根据自己业务场景进行决定。数据丢失与性能之间权衡。而Redis中AOF机制,也有appendfsync对应的策略。你看都是相同的思想。

【Redis】聊一下持久化机制-AOF

  • redo log写入磁盘的时机
    • 0.定时写入,每个1s中,同步一次。
      • 最多丢失1s的事务操作,写入效率高,安全性最低。
    • 1.事务提交时,写入磁盘。
      • 不会丢失数据,但是写入效率低
    • 2.事务提交时,写入os cache
      • 依赖于系统,安全性剧中。
# 查看写入时机参数配置 show VARIABLES like 'innodb_flush_log_at_trx_commit';

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

checkPoint机制

checkPoint是将缓冲池中脏页数据刷到磁盘上的机制,决定脏页落盘的时机,条件选择。
可以通过如下命令来观察。

 show engine innodb status;

方式

  • sharp checkpoint:关闭数据库时将脏页全部刷新到磁盘中
  • fuzzy checkpoint:默认方式,在运行时选择不同时机将脏页刷盘,只刷新部分脏页
    • Master Thread Checkpoint:异步操作,固定频率刷新。
    • FLUSH_LRU_LIST Checkpoint:缓冲池淘汰非热点Page,如果该Page是脏页会执行CheckPoint
    • Async/Sync Flush Checkpoint:redo log不可用时,强制刷新。
    • Dirty Page too much Checkpoint:达到一定阈值 show variables like 'innodb_max_dirty_pages_pct'; 查看阈值

DoubleWrite机制

因为InnoDB是16KB一页,但是如果只写了一半的数据8KB,系统宕机怎么办? 这个其实就是写失效Partial Page Write

redo log不能解决写失效问题,因为redo log日志记录的是对页的修改记录而不是数据本身。
在这里插入图片描述
**核心流程:**其实先进行将数据复制到Double Write Buffer中, 然后在顺序写入系统表空间和离散写入磁盘。
在这里插入图片描述
当系统故障的时候,通过找到系统表空间Dubble Write区域对应的页副本数据,将其复制到独立表空间。
在这里插入图片描述

总结

本篇从InnoDB存储结构分析,系统表空间->段->区->页->行。然后接着介绍了数据是如何写入磁盘中,以及引出的脏页问题,通过check point解决。但是check point 没有办法针对 写失效问题解决。索引引出了双写机制。

其实从设计点上,我们可以分析出,设计一个存储中间件的目的其实就是通过各种方式保证数据的安全,以及高可用,高性能。从中我们可以学到WAL 机制、异步刷盘操作等。

这里顺便总结下,其实从MySQL角度来看的话,其实就是

  • InnoDB存储结构
  • 索引优化
  • 事务机制 MVCC等
  • 锁机制
  • 日志分类
  • 读写分离、分库分表

总这几点出发,就可以很快掌握面试重点以及掌握MySQL。

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

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

相关文章

k8s资源介绍

Kubernetes架构图 Kubernetes系统用于管理分布式节点集群中的微服务或容器化应用程序,并且其提供了零停机时间部署、自动回滚、缩放和容器的自愈(其中包括自动配置、自动重启、自动复制的高弹性基础设施,以及容器的自动缩放等)等…

pytorch安装教程

安装pytorch 创建conda虚拟环境,选择安装电脑CUDA版本的安装即可 最新版:Start Locally | PyTorch 历史版本:Previous PyTorch Versions | PyTorch # CUDA 10.1 pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f h…

上海智慧岛大数据云计算中心项目正式封顶!

上海智慧岛大数据云计算中心封顶仪式现场 1月15日,云端股份在上海智慧岛大数据云计算中心举行封顶仪式。云之端网络(江苏)股份有限公司(以下称“云端股份”)总经理贡伟力先生,常务副总张靖先生等公司成员&…

VS生成C++动态链接库DLL

1、官方文档: 在 Visual Studio 中创建 C/C DLL | Microsoft Learn 演练:创建和使用自己的动态链接库 (C) | Microsoft Learn 创建和调用步骤,主要按照第二篇操作。 一、建立DLL项目生成库文件 直接建立C的DLL项目,注意叙述&am…

Docker(八)高级网络配置

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 高级网络配置 注意:本章属于 Docker 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习…

飞天使-docker知识点13-查找docker run 启动时候命令与升级docker版本

文章目录 如果很久了&#xff0c;不记得之前docker run 命令然后在升级docker 版本 如果很久了&#xff0c;不记得之前docker run 命令 # 安装runlike安装包 pip install runlike# 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是…

低代码开发:数据处理与可视化

低代码开发是一种快速、高效的应用开发方法&#xff0c;它通过简化和自动化开发过程&#xff0c;使非专业开发人员也能快速构建数据处理和可视化应用。本文将介绍低代码开发的定义、优势&#xff0c;并以数据处理与可视化为例&#xff0c;探讨低代码开发在这一领域的应用和价值…

广东金牌电缆:法大大电子合同助力业务风险管控

广东金牌电缆集团股份有限公司&#xff08;以下简称“广东金牌电缆”&#xff09;成立于2013年&#xff0c;现为广东省电线电缆重点生产企业、广东省守合同重信用单位、国家专精特新小巨人企业、国家高新技术企业&#xff0c;拥有自主商标“夺冠”&#xff0c;“夺冠”商标被评…

Python 中多线程与多处理之间的区别

一、说明 在本文中&#xff0c;我们将学习 Python 中多线程和多处理的内容、原因和方式。在我们深入研究代码之前&#xff0c;让我们了解这些术语的含义。 二、基本术语和概念 程序是一个可执行文件&#xff0c;它由一组执行某些任务的指令组成&#xff0c;通常存储在计算机的…

IntelliJ IDEA 常用快捷键一览表(通用型,提高编写速度,类结构、查找和查看源码,替换与关闭,调整格式)

文章目录 IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、替换…

第二课:BERT

文章目录 第二课&#xff1a;BERT1、学习总结&#xff1a;为什么要学习BERT&#xff1f;预训练模型的发展历程BERT结构BERT 输入BERT EmbeddingBERT 模型构建BERT self-attention 层BERT self-attention 输出层BERT feed-forward 层BERT 最后的Add&NormBERT EncoderBERT 输…

修复uni-simple-router@2.0.7版本query参数null的bug

问题&#xff1a;query参数为null或者为空时&#xff0c;插件内部参数校验问题导致的会报错&#xff1a;TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下&#xff1a; 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-packag…

Python实现两个列表相加的方法汇总

1. 使用 “” 运算符 通过 “” 运算符将两个列表相加&#xff0c;得到一个新的列表。例如&#xff1a; list1 [1, 2, 3] list2 [4, 5, 6] result list1 list2 print(result) # [1, 2, 3, 4, 5, 6]2. 使用 extend 方法 使用 extend 方法将一个列表中的元素逐个添加到另…

【24.1.19】

24.1.19 本周工作内容下周工作计划 本周工作内容 本周的话主要的一个工作还是第三部分页面部分的完成工作&#xff0c;那就先来汇报一下第三部分的工作进度&#xff0c;第三部分的页面工作呢已经完成啦&#xff0c;就在刚刚提交啦全部的代码&#xff0c;那么这一部分的工作呢也…

使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法

前言 这算得上是近些年的前端网红题了&#xff0c;曾经对这种网红题非常抵触&#xff0c;认为非常没有意义。 看到了不少人有做分享&#xff0c;有各种各样的方案&#xff0c;有涉及到 JS 非常基础的知识点&#xff0c;也不得不感叹解题者的脑洞之大。 但是&#xff0c;拿来…

传奇服务器搭建

传奇服务器搭建 传奇是一款非常经典的游戏&#xff0c;自从它推出以来就深受玩家们的喜爱。如果你也想要在自己的服务器上搭建一个传奇&#xff0c;那么本文将为你提供一些有用的信息。 首先&#xff0c;我们需要知道什么是传奇服务器。简单来说&#xff0c;它就是一个能够让…

公司OA办公系统使用阿里云服务器怎么选配置?

公司OA、ERP等办公系统如何选择阿里云服务器配置&#xff1f;可以选择第七代企业级独享型云服务器&#xff0c;ECS通用型g7、计算型c7或内存型r7实例&#xff0c;4核CPU8G内存、8核16G、4核16G等配置&#xff0c;活动 https://t.aliyun.com/U/bLynLC 实例规格使用场景vCPU内存…

线程池c++实现

线程池c实现 概述 线程池&#xff08;Thread Pool&#xff09;是一种并发编程的设计模式&#xff0c;它用于管理和重复使用线程&#xff0c;以提高程序的性能和资源利用率。线程池通过维护一组预先创建的线程&#xff0c;这些线程可以在需要时被重复使用&#xff0c;而不是为…

HarmonyOS鸿蒙学习基础篇 - 什么是HarmonyOS

概述 HarmonyOS是华为开发的一款面向未来的全场景分布式智慧操作系统&#xff0c;将逐步覆盖18N全场景终端设备&#xff1b; 对消费者而言 HarmonyOS用一个‘统一的软件系统’ 从根本上解决消费者面对大量智能终端体验割裂的问题&#xff0c;为消费者带来同意便利安全的智慧化全…

相关系数(皮尔逊相关系数和斯皮尔曼相关系数)

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;5.1 对数据进行描述性统计以及皮尔逊相关系数的计算方法_哔哩哔哩_bilibili 注&#xff1a;直接先看 &#xff08; 三、两个相关系数系数的比较 &#xff09; 部分&#x…