【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)

本文主要是介绍【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C++ Linux的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.架构
    • 1.内存结构
      • 1.缓冲池:Buffer Pool
      • 2.更改缓冲区:Change Buffer
      • 3.自适应哈希索引:Adaptive Hash index
      • 4.日志缓冲区:Log Buffer
    • 2.磁盘结构
      • 1.系统表空间:System Tablespace
      • 2.表的独立表空间:File-Per-Table Tablespaces
      • 3.通用表空间:GeneralTablespaces
      • 4.撤销表空间:Undo Tablespaces
      • 5.临时表空间:Temporary Tablespaces
      • 6.双写缓冲区:Doublewrite Buffer Files
      • 7.重做日志:Redo Log
    • 3.后台线程——把缓冲池信息刷新到磁盘当中

一.架构

  • MySQL5.5版本开始,默认使用|nnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。
  • 下面是InnoDB架构图, 左侧为内存结构,右侧为磁盘结构。
  • 简单看一下,下面有具体介绍
    在这里插入图片描述

1.内存结构

InnoDB引擎的内存架构分为下面四个:

  1. 缓冲池:Buffer Pool
  2. 更改缓冲区:Change Buffer——(针对非唯一,二级索引页)
  3. 自适应哈希索引
  4. 日志缓冲区

1.缓冲池:Buffer Pool

在这里插入图片描述

2.更改缓冲区:Change Buffer

  • Change Buffer的意义
  • 在增删改查时,不用每一次直接操作磁盘IO, 先操作Change Buffer中的数据(合并处理等操作)
  • 再以一定频率把Change Buffer中的数据同步到Buffer Pool ,最后再刷新到磁盘中
    在这里插入图片描述
    在这里插入图片描述

3.自适应哈希索引:Adaptive Hash index

  • InnoDB引擎 默认不支持哈希索引 ,支持 B+树索引。
  • 前情提要,哈希索引优势是快,只需要一次匹配即可(排除哈希冲突情况下)。而B+树则需要匹配两三次。
  • 但哈希索引的局限在于,不能做范围查询,只能做等值匹配等操作
  • 所以自适应哈希索引等于是上了一层自动监控, 如果hash索引更快,他会建立哈希索引
    在这里插入图片描述

4.日志缓冲区:Log Buffer

  • 用于保存日志文件redolog,undolog
    在这里插入图片描述

2.磁盘结构

结构总览,具体解读在下面
在这里插入图片描述

1.系统表空间:System Tablespace

  • System Tablespace: 系统表空间 更改缓冲区 存储区域
  • 如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)
    参数:innodb_data_file_path
    在这里插入图片描述

2.表的独立表空间:File-Per-Table Tablespaces

  • 取决于独立表空间的开关【参数:innodb_file_per_able】是否开启,若开启。则相关数据不会上上文所述系统表空间System Tablespace中存放
  • File-Per-Table Tablespaces:每个表的文件表空间包含单个InnoDB表的数据和索引,并存储在文件系统上的单个数据文件中
    在这里插入图片描述

3.通用表空间:GeneralTablespaces

  • 不自己创建,则没有这块表空间文件
  • GeneralTablespaces:通用表空间,需要通过CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。
    在这里插入图片描述

4.撤销表空间:Undo Tablespaces

  • Undo Tablespaces:撤销表空间,MySQL实例在初始化时会自动创建 两个默认的undo表空间 (初始大小16M)(图中undo_001,undo_002),用于存储undolog日志。
    在这里插入图片描述

5.临时表空间:Temporary Tablespaces

  • InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据
    在这里插入图片描述

6.双写缓冲区:Doublewrite Buffer Files

  • 一个中转的缓冲区, 出意外时可以通过双写缓冲区恢复数据
  • Doublewrite Buffer Files:双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。
  • 双写缓冲区文件【.dblwr】
    在这里插入图片描述

7.重做日志:Redo Log

  • Redo Log:重做日志,是用来实现事务的持久性。不会一直保存,隔一段时间会清理没有使用的Redo Log
  • 该日志文件由两部分组成: 重做日志缓冲 (redo logbuffer)以及 重做日志文件 (redo log),前者是在内存中,后者在磁盘中。
  • 当事务提交之后会把 所有修改信息 都会存到该日志中,用于在刷新脏页到磁盘时,发生错误时,进行数据恢复使用。
  • 循环写入涉及下面两个文件
    在这里插入图片描述
    在这里插入图片描述

3.后台线程——把缓冲池信息刷新到磁盘当中

  • 后台线程主要作用:把缓冲池信息在合适的时机刷新到磁盘当中
    -

在这里插入图片描述

  • 分为4个线程
  1. Master Thread
    核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性还包括脏页的刷新、合并插入缓存、undo页的回收
  2. IO Thread
    在InnoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大地提高数据库的性能,而I0Thread主要负责这些IO请求的回调。
    在这里插入图片描述
  3. Purge Thread
    主要用于回收事务已经提交了的undolog,在事务提交之后,undolog可能不用了,就用它来回收。
  4. Page Cleaner Thread
    协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞。

这篇关于【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106911

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c