MySQL中InnoDB逻辑存储结构

在MySQL中,InnoDB是最常用的存储引擎之一,它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次,下面是详细的解析。

1. 表空间 (Tablespace)

InnoDB的物理存储结构以表空间为基础。表空间负责管理存储数据、索引、表、日志等内容。InnoDB可以使用系统表空间(ibdata 文件)或独立表空间(*.ibd 文件)来存储数据。

  • 系统表空间:默认情况下,InnoDB将所有数据库的表和索引都存储在一个共享的表空间文件(ibdata1)中。可以包含多个数据库的表。
  • 独立表空间:如果开启了 innodb_file_per_table 配置项,每个表的数据和索引会存储在独立的 .ibd 文件中。

2. 页 (Page)

在InnoDB的存储引擎中,数据是按页(page)存储的,最小的I/O操作单位是页。每个页的大小通常为16KB,可以通过配置项 innodb_page_size 设置。一个表的数据文件由多个这样的页组成。

页分为以下几种类型:

  • 数据页 (Data Page):存储实际的数据行。每个数据页通常存储多个记录(row),它们的存储格式由行的长度和字段决定。
  • 索引页 (Index Page):存储B+树索引结构。索引是通过B+树结构来实现的,B+树的每个节点也是一个页。
  • 系统页 (System Page):存储InnoDB的元数据,如表空间、段、文件和表的相关信息。

3. 簇 (Cluster)

InnoDB表数据是以簇(Cluster)的方式存储的。InnoDB中的簇是指数据和索引被存储在一起的方式。每个InnoDB表都有一个主索引(聚簇索引),这个主索引包含了数据表的所有数据行。通过主键索引可以定位到数据页。

如果表没有定义主键,InnoDB会选择一个唯一索引作为聚簇索引,如果没有任何唯一索引,则会为其生成一个隐藏的聚簇主键。

4. B+树结构 (B+ Tree)

InnoDB使用B+树作为索引的数据结构。B+树是一种平衡树,它将数据组织为一个有序的结构,并提供高效的查找、插入、更新和删除操作。

  • 叶子节点:存储实际的数据行(对于聚簇索引来说,叶子节点就是数据本身)。
  • 非叶子节点:仅存储索引值,用来指向下一级节点或叶子节点。

InnoDB的B+树索引通常有两种类型:

  • 聚簇索引(Clustered Index):数据行按照主键的顺序存储在磁盘上,并且主键索引就是聚簇索引。
  • 非聚簇索引(Non-Clustered Index):存储的是索引字段以及对应的主键值,数据行存储在聚簇索引中,而非聚簇索引通过主键来访问数据。

5. 插入缓冲(Insert Buffer)

为了提高插入性能,InnoDB会使用插入缓冲来延迟更新索引。插入缓冲会先将插入操作保存在内存中的缓冲区(即插入缓冲),并在合适的时机将这些修改刷新到磁盘上的索引页中。

6. 锁机制

InnoDB支持多种锁机制,主要有行级锁和表级锁:

  • 行级锁:锁定的是特定的行,允许多个事务同时修改不同的行,支持并发性。
  • 表级锁:锁定整个表,其他事务不能对该表进行修改操作,支持较低的并发性。

7. 双写缓冲 (Doublewrite Buffer)

为了确保数据在崩溃恢复时的一致性,InnoDB使用双写缓冲(doublewrite buffer)。数据首先被写入一个双写缓冲区,然后再写入实际的表空间。这可以保证在写入过程中出现崩溃时数据不会丢失或损坏。

8. 段 (Segment)

InnoDB使用段来组织磁盘上的数据结构。每个表、索引、数据等都可以被划分到一个段中。段负责管理多个页。

9. 事务日志 (Transaction Log)

InnoDB通过事务日志来支持事务的ACID特性。事务日志包括:

  • 重做日志(Redo Log):用于恢复事务提交后的操作。所有的修改操作都先记录到Redo Log,然后再更新到数据文件中。
  • 撤销日志(Undo Log):用于回滚未提交的事务,保证数据一致性。
  • 二进制日志(Binary Log):记录数据库的所有更改(包括DDL和DML操作),用于复制和数据恢复。

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

为了提高查询性能,InnoDB还支持自适应哈希索引。当InnoDB发现某个索引的访问模式较为频繁时,它会自动创建哈希索引来加速查询。

11. 自适应索引刷新

InnoDB的缓存管理器会定期刷新索引和数据页,尤其是在内存压力较大的情况下,系统会自动决定哪些页需要刷新到磁盘上,以保持性能。

总结

InnoDB的逻辑存储结构包括了表空间、页、簇、B+树、插入缓冲、锁机制、双写缓冲、段、日志等多个重要组成部分。这些设计帮助InnoDB提供高效的事务处理、数据存储、索引管理以及高并发支持。

如果你对某个具体部分有更深的兴趣,或者需要更详细的解析,可以继续问我!

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

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

相关文章

字符设备驱动模版-中断

字符设备驱动模版-中断 思维导图在线高清查看:https://www.helloimg.com/i/2025/01/27/679791b5257c0.png 修改设备树 1添加pinctrl节点 1创建对应的节点 在 iomuxc 节点的 imx6ul-evk 子节点下 2添加“fsl,pins”属性 3在“fsl,pins”属性中添加PIN配置信息 …

【SH】Windows禁用Alt+F4关机、重启、注销等功能,只保留关闭应用的功能

文章目录 组策略编辑器参考文档 组策略编辑器 亲测有效! 1、按winr,输入gpedit.msc,回车。 2、找到》用户配置》管理模板》“开始”菜单和任务栏。 3、在右侧找到删除并阻止访问“关机”、“重新启动”、“睡眠”和“休眠”命令&#xff0c…

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…

分库分表后如何进行join操作

在分库分表后的系统中,进行表之间的 JOIN 操作比在单一数据库表中复杂得多,因为涉及的数据可能位于不同的物理节点或分片中。此时,传统的 SQL JOIN 语句不能直接用于不同分片的数据,以下是几种处理这样的跨分片 JOIN 操作的方法&a…

【深度学习】线性回归的简洁实现

线性回归的简洁实现 在过去的几年里,出于对深度学习强烈的兴趣,许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 目前,我们只会运用: (1)通…

C++中的显式构造和隐式构造

文章目录 一、概述二、显式构造函数的使用三、隐式构造函数的使用四、显式和隐式的适用场景 一、概述 在 C 中,构造函数可以分为 显式构造 和 隐式构造,它们的区别主要体现在构造函数的调用方式上。 1.显式构造(Explicit Constructor&#…

【YOLOv11改进- 主干网络】YOLOv11+MobileNetV3(2019): 更快,更精准;

YOLOV11目标检测-主干网络改进实例与创新改进专栏 目录 YOLOV11目标检测-主干网络改进实例与创新改进专栏 本文介绍 1.完整代码获取 2.MobileNetv3介绍 文章摘要 3. MobileNetv3网络结构图 4. yolov11-MobileNetv3 yaml文件 5.MobileNetv3代码实现 6.MobileNetv3添加方…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…

浅谈文献阅读(reference)对留学论文写作的重要性

很多留学生在写作留学论文时,拿到题目后就急于求成立马动笔写作。可是写着写着就会陷入非常迷惘的境地,不知道如何继续。当然这其中有很多原因,但其中最重要的一条,就是在写作英语论文之前,没有进行足够的知识积累&…

es6中关于let的使用以及案例,包括但不限于块级作用域,不允许重复声明,没有变量提升,暂存性死区,不与顶层对象挂钩

ES6 let 关键字完整指南 1. 块级作用域 1.1 let vs var 作用域对比 // var - 函数作用域 function varExample() {var x 1;if (true) {var x 2; // 同一个 xconsole.log(x); // 2}console.log(x); // 2 }// let - 块级作用域 function letExample() {let x 1;if (true…

提升企业内部协作的在线知识库架构与实施策略

内容概要 在当前快速变化的商业环境中,企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台,成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库,强调架构设计、知识资产分类管理及…

网络工程师 (3)指令系统基础

一、寻址方式 (一)指令寻址 顺序寻址:通过程序计数器(PC)加1,自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。跳…

度小满Java开发面试题及参考答案 (上)

String 是基本类型吗?String、StringBuffer、StringBuilder 的区别是什么?拼接字符串有哪些做法? String 不是基本类型,它是 Java 中的一个类,属于引用类型。 下面来看看 String、StringBuffer、StringBuilder 的区别: 类型可变性线程安全性性能适用场景String不可变线程…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现,详见下文: 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了…

vue项目中,如何获取某一部分的宽高

vue项目中,如何获取某一部分的宽高 在Vue项目中,如果你想要获取某个DOM元素的宽度和高度,可以使用原生的JavaScript方法或者结合Vue的特性来实现。以下是几种常见的方法: 使用ref属性 你可以给需要测量宽高的元素添加一个ref属…

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…

函数与方法

具名函数 具名函数是有名称的函数,可以在定义之前或之后调用。 特点 有函数名。定义后可以多次调用。便于调试,因为在调用栈中可以看到函数名。 function add(a, b) {return a b; }console.log(add(2, 3)); // 输出: 5 匿名函数 匿名函数没有名称…

定制Centos镜像(一)

环境准备: 一台最小化安装的干净的系统,这里使用Centos7.9,一个Centos镜像,镜像也使用Centos7.9的。 [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# rpm -qa | wc -l 306 [rootloca…

Android - 通过Logcat Manager简单获取Android手机的Log

由于工作需要,经常需要获取Android手机的Log。 平常都是通过adb命令来获取,每次都要写命令。 偶然的一个机会,我从外网发现了一个工具 Logcat Manager,只需要通过简单的双击即可获取Android的Log,这里也分享一下。 目…