当前位置: 首页 > article >正文

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提供高效的事务处理、数据存储、索引管理以及高并发支持。

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

相关文章:

MySQL中InnoDB逻辑存储结构

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

高阶C语言|深入理解字符串函数和内存函数

文章目录 前言1.求字符串长度1.1 字符串长度函数:strlen模拟实现 长度不受限制的字符串函数1.2 字符串拷贝函数:strcpy模拟实现 1.3 字符串连接函数:strcat模拟实现 1.4 字符串比较函数:strcmp模拟实现 长度受限制的字符串函数2.1…...

Pandas DataFrame 拼接、合并和关联

拼接:使用 pd.concat(),可以沿着行或列方向拼接 DataFrame。 合并:使用 pd.merge(),可以根据一个或多个键进行不同类型的合并(左连接、右连接、全连接、内连接)。 关联:使用 join() 方法,通常在设置了索引的 DataFrame 上进行关联操作。 concat拼接 按列拼接 df1 = …...

特种作业操作之低压电工考试真题

1.下面( )属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案:C 2.事故照明一般采用( )。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案:B 3.人体同时接触带电设备或线路中的两相导体时,电流从一相通过人体流…...

“Play around” 在编程领域的含义

“Play around” 的含义 If everything is working correctly we should have a play around in the prompt and verify that functions are actually a new type of value now, not symbols. https://www.buildyourownlisp.com/chapter11_variables 在这段话中,“p…...

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…...

通过protoc工具生成proto的pb.go文件以及使用protoc-go-inject-tag工具注入自定义标签

1.ProtoBuf认识,安装以及用法 参考:[golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用 2. 使用protoc-go-inject-tag工具注入自定义标签 这里有一个案例: syntaxproto3; package test;option go_package ".;test";message MyMessage {int6…...

进程池的制作(linux进程间通信,匿名管道... ...)

目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…...

Gurobi 基础语法之 tupledict 和 tuplelist

Python中的字典:dict 我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值来对数据进行映射,任何无法修改的python对象都可以当作键值来使用,这些无法修改的Python对象包括:整数(比如:1),浮…...

Flutter:搜索页,搜索bar封装

view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...

IoTDB 2025 春节值班与祝福

2025 春节快乐 瑞蛇迎吉庆,祥光映华年,2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐,“蛇”来运转! IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日,1 月 25 日、26…...

14、Java 对象关系映射(ORM)框架:简化数据库操作的利器

嘿,Java 开发者们!在我们的编程旅程中,经常会遇到一个重要的任务,那就是将 Java 对象和数据库表进行交互。传统的 JDBC 编程虽然强大,但代码往往会变得繁琐且容易出错。这时候,对象关系映射(ORM…...

鲁滨逊漂流记读后感

前言:学校要求出鲁滨逊漂流记的读后感啊,那么今天我就写着试试叭,好久都没更新了嘤,可能写的不好嗷。真的不是很建议参考,因为我的思想可能会与学校的要求不同,更多的是介入了自己的思考,从鲁滨逊好的地方和…...

【面试】【前端】前端网络面试题总结

一、前端网络面试题总结 网络相关知识是前端开发的核心内容之一,面试中通常会考察协议、网络模型、性能优化及常见网络问题的处理。以下是针对前端网络面试题的总结: (一)协议森林(大话网络协议) 网络协议…...

【MQ】如何保证消息队列的高性能?

零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…...

刀客doc:禁令影响下,TikTok广告业务正在被对手截胡

一、 现如今,TikTok在美国的命运迎来了暂时的反转,根据Adage的报道,广告主的投放在恢复。但短暂的关闭带来的影响依然有余震,一些广告主在重新评估TikTok在自己广告预算中的地位,这些是竞争对手截胡的机会。 长期以…...

中国电信AI大模型发布:评分超o1-preview,近屿智能带您探索AI技术新境界

近日,中国电信人工智能研究院宣布,其自主研发的复杂推理大模型TeleAI-t1-preview即将上线天翼AI开放平台。该模型采用强化学习训练方法,显著提升了逻辑推理和数学推导的准确性,展现了强大的复杂问题解决能力。 在权威评测中&#…...

服务定位器模式

服务定位器模式 引言 服务定位器模式(Service Locator Pattern)是一种设计模式,旨在解决应用程序中服务管理的问题。它通过提供一个中央服务注册中心,将服务提供者与服务消费者解耦,从而简化了服务的查找和依赖管理。…...

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统(UnionFS)、命名空间(namespace)、权限管理(cgroup),虚拟出一…...

AI代理框架:突破LLMs极限的未来之路

标题:“AI代理框架:突破LLMs极限的未来之路” 文章信息摘要: 大型语言模型(LLMs)已接近通过预训练和数据扩展所能达到的极限,未来的AI进步将依赖于强化学习(RL)和代理框架。代理框架…...

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景:我想把旧仓库迁移新仓库中,放进去之后,新仓库会显示这个项目之前的所有提交,如何不显示这些旧的提交? 二、原因 我们需要将旧仓库迁移新仓库中,但是又不想在新仓库中显示旧的提交记录…...

人工智能在计算机视觉中的应用与创新发展研究

一、引言 1.1 研究背景与意义 1.1.1 研究背景 在当今数字化与智能化飞速发展的时代,人工智能已成为推动各领域变革的核心力量,而计算机视觉作为人工智能领域中极具活力与潜力的重要分支,正发挥着日益关键的作用。计算机视觉旨在赋予计算机…...

使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍

关于Qt的一点介绍 Qt是一个免费的开源部件工具包,用于创建跨平台GUI应用程序,允许应用程序从Windows瞄准多个平台,macOS, Linux和Android的单一代码库。但是Qt不仅仅是一个Widget工具箱和功能内置支持多媒体,数据库&am…...

4、PyTorch 第一个神经网络,手写神经网络的基本部分组成

假设有一个二维数据集,目标是根据点的位置将它们分类到两个类别中(例如,红色和蓝色点)。 以下实例展示了如何使用神经网络完成简单的二分类任务,为更复杂的任务奠定了基础,通过 PyTorch 的模块化接口&#…...

挂载mount

文章目录 1.挂载的概念(1)挂载命令:mount -t nfs(2)-t 选项:指定要挂载的文件系统类型(3)-o选项 2.挂载的目的和作用(1)跨操作系统访问:将Windows系统内容挂载到Linux系统下(2)访问外部存储设备(3)整合不同的存储设备 3.文件系统挂载要做的事…...

算法刷题Day30

题目链接 描述 解题思路 考点:动态规划 dp[i][j]表示当前坐标的最小路径和dp初始化状态转移: dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比较正上方和正左方的路径和哪个小。取小的那条路 代码 import copy class Solution:def minPathS…...

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…...

DeepSeek助攻!VS Code+Continue 解放双手编程!

简介 要想在vscode中采用AI&#xff0c;那么就需要添加AI插件&#xff0c;通过API来访问不同的模型。 Continue 插件 一款常用的AI代码助手&#xff0c;可以通过vscode和jetbrains来自动补全&#xff0c;推演代码。还有聊天功能。 https://marketplace.visualstudio.com/item…...

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…...

日志收集Day008

1.zk集群优化 修改zookeeper的堆内存大小&#xff0c;一般情况下&#xff0c;生产环境给到2G足以&#xff0c;如果规模较大可以适当调大到4G。 (1)配置ZK的堆内存 vim /app/softwares/zk/conf/java.env export JAVA_HOME/sortwares/jdk1.8.0_291 export JVMFLAGS"-Xms2…...