iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >InnoDB的外存数据结构介绍
  • 738
分享到

InnoDB的外存数据结构介绍

2024-04-02 19:04:59 738人浏览 泡泡鱼
摘要

这篇文章主要讲解了“InnoDB的外存数据结构介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“InnoDB的外存数据结构介绍”吧!PartⅠ 表和表空间“

这篇文章主要讲解了“InnoDB的外存数据结构介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“InnoDB的外存数据结构介绍”吧!

PartⅠ 表和表空间

“Everything is a file…”这句至理名言告诉我们一切都得从文件说起。那么对 InnoDB 外存数据结构的学习,我们也先从表和文件开始。

一、表 ( Table )

当我们使用 CREATE TABLE 创建一个表时,Mysql 会创建一个 .frm 文件和一个 .ibd 文件。.frm 文件是描述表结构定义的文件,而 .ibd 文件是 InnoDB 引擎层特有的,用于记录InnoDB表的数据。举个例子,在 db.CCCtest 下创建一个表”jersey_test”,建表语句如下:

CREATE TABLE `jersey_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `requestId` char(64) NOT NULL COMMENT 'request',
  `type` smallint(6) NOT NULL DEFAULT '0' COMMENT '类型',
  `name` varchar(64) NOT NULL COMMENT 'name',
  PRIMARY KEY (`id`),
  KEY `request` (`requestId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

同时,我们往表中插入一条记录如下:

InnoDB的外存数据结构介绍

[ jersey_test 表中的数据 ]

我们进入到 mysql 的 /data 目录下面,可以看到”jersey_test.frm”文件和”jersey_test.ibd”文件。

InnoDB的外存数据结构介绍[ CCCtest 库中的文件 ]

.frm 文件是二进制格式的,我们通过 hexdump 工具稍加分析,可以看到文件中除了一些编码信息外,主要内容就是表结构信息。

InnoDB的外存数据结构介绍[ .frm 文件内容 ]

这和我们使用 DESC TABLE 语法看到的表结构描述一致。

InnoDB的外存数据结构介绍[ 表结构描述 ]

数据文件 .ibd 的分析与之类似。

二、Row FORMats

InnoDB 中的表都是分文件存储的,表中的行数据也按照相应的格式记录在文件中。这里我们简要归纳一下 InnoDB 所支持的文件存储格式和行存储格式。InnoDB 的文件格式由参数 innodb_file_format 指定,它支持 Antelope 和 Barracuda 两种文件格式。Barracuda 是新的文件格式,它是包含 Antelope 格式在内的。Antelope 文件格式支持两种行存储格式,Compact 和 Redundant ,Barracuda 支持的新的行存储格式为 Compressed 和 Dynamic。

InnoDB的外存数据结构介绍[ InnoDB行存储格式 ]

InnoDB 表的行存储格式由参数 innodb_default_row_format 指定,在 5.7 版本中的默认值为 Dynamic 。行存储格式决定了表中的记录在文件中是如何进行存储的,不同的行存储格式有其特殊的优势和劣势,也会影响数据库的行为。例如,使用 Compressed 这种格式可以使行记录有更高的压缩比,如果一个物理页能存放的行记录越多,它的索引或记录查找会更快,内存消耗也会更小,但是压缩数据本身也会带回额外的系统开销。另外一个需要注意的地方是,在进行数据库表迁移时,需要关注源实例和目标实例的 Row Format 是否匹配。比如你有一个 MyISAM 的表要迁移到 InnoDB 上,并且 MyISAM 表的 Row Format 为默认值 Fixed ,此时需要改成 Dynamic ,因为这两种格式对变长字段如 varchar/blob/text 等的处理是不一致的。

三、表空间 ( TableSpace )

我们前面谈到,InnoDB 每个表都有自己独立的文件,其实是用到了它的默认行为,即使用独立表空间,它由参数 innodb_file_per_table 控制。事实上 InnoDB 包含多种表空间类型,包括系统表空间 ( System TableSpace ),独立表空间 ( File-Per-Table TableSpace ) 和通用表空间 ( General TableSpace ) 等。

系统表空间存储了 InnoDB 的数据字典(元数据信息),系统表,双写缓冲区 ( doublewrite buffer ),Change Buffer 等。如果将参数 innodb_file_per_table 置为 OFF ,即所有的表数据都存储在系统表空间中。但是在使用 InnoDB 时,更推荐的方法是将 innodb_file_per_table 置为 ON,即使用独立表空间,它有如下几个好处:

  1. 当使用 Truncate Table 和 Drop Table 命令删除表时,系统会直接删除表的数据文件,即回收物理空间。而使用系统表空间则无法回收这些物理空间;

  2. 和上面类似,当使用重建表的语法时,如 OPTIMIZE TABLE 或者 ALTER TABLE ENGINE = InnoDB 时,系统也能够回收物理空间;

  3. 可以单独将某个表指定到对应的存储位置,这个存储位置可以不在 Mysql 的数据目录下。比如你想使用 RaiD 或者 SSD 来存储某个表,当你使用独立表空间时,就可以通过 CREATE TABLE … DATA DIRECTORY 这个语法来实现。

使用独立表空间也有一些潜在的问题。例如,每个表都有自己的单独的文件,容易造成物理空间的浪费,如果数据库有很多小表的话,这种空间浪费也会比较明显。通用表空间 ( General TableSpace ) 可以缓解这个问题。通用表空间可以认为是 all-in-one (系统表空间) 和 file-per-table 的一个折中,它允许你使用 CREATE TABLESPACE 语法创建一个大的空间,然后你可以向这个空间中添加一些表的数据文件进行存储,这些表的数据文件是共享存储空间的。

Part Ⅱ 索引

索引可以说是 InnoDB 最重要的数据结构,介绍数据库索引的资料也很多,谈点题外话,什么是索引呢?索引其实就是帮助我们快速查找到数据( data ) 的辅助结构,可以说有数据的地方就需要索引。比如在文件系统里,数据的索引保存在元数据 inode 信息中,它记录着这个文件所有的数据页( data pages ) 具体在哪个位置,比如文件有10个页,它就对应记录10个页框的物理地址。文件系统的索引当然也会有直接索引和间接索引,因为如果直接索引装不下,就会用二级索引来装,其结构如下图所示,

InnoDB的外存数据结构介绍[ 文件系统 inode 结构 ]

操作系统中最常见(也可能是最快)的索引大概是虚拟地址到物理地址的映射表。之所以快,首先在于它是连续的,当你进行跨页访问的时候不需要去计算下一个页的地址,另外地址的转换是由专门的硬件MMU来做的,硬件肯定更快。可以设想一下,如果文件存储或者数据库存储的索引也采用虚拟地址映射表加上硬件加速的话,肯定会比现有的方式更快。虚拟地址直接映射到进程地址空间还可以减少进入内核态的开销。

说回 InnoDB 的索引结构,InnoDB 的索引采用 B+ 树这种数据结构,InnoDB 表中的行数据都是由聚簇索引 ( clustered index ) 组织的,它也被称作主键索引 ( primar key ),即主键索引这棵 B+ 树的叶子节点存储的是主键对应的整行数据。为 InnoDB 的每个表都建立自增的主键索引非常重要,之所以需要自增,是因为在插入新记录时可以做到连续,追加插入,这样可以减少索引查找和索引页分裂所带来的额外开销。InnoDB 其他的索引称为二级索引 ( secondary index ),二级索引的叶子节点存储的是主键索引的值,因此,绝大多数使用二级索引查询记录时,都会先通过二级索引找到主键索引的值,再通过主键索引找到行记录。

Part Ⅲ 恢复日志

一、重做日志和回滚日志 ( Redo Log & Undo Log )

在 InnoDB 中,数据一致性由 Redo Log 来保证,它使用的是 WAL(Write-Ahead Logging) 机制,即先写日志再写数据。InnoDB 使用这种方式在进行故障恢复时,会将 Redo Log 中的日志重做一遍,也就是将系统中未提交的事务重新执行。默认情况下,Redo Log 记录在磁盘的 ib_logfile0 和 ib_logfile1 这两个文件里,MySQL 循环的写这两个文件,因此,Redo Log 会有写满的情况,这里就需要介绍日志中的 checkpoint 机制。checkpoint 记录了整个系统当前日志已经同步到的位置,也就是说,在 checkpoint 之前的事务都是已经提交的事务,数据不会存在不一致的情况。而当 MySQL 写入 Redo Log 记录追上 checkpoint 时,Redo Log 就写满了,此时需要等待 Redo Log 同步数据并释放空间。

另一方面,在数据库这种存储系统中,更新操作失败并回滚的情况是很常见的,所以需要特别关注这种情况,Undo Log 就是用来解决这个问题。Undo Log 记录的是当一个更新操作失败需要回滚时,应该进行哪些反向操作。即当你 insert 一条记录时,Undo log中会记录一条对应的 delete 记录,反之亦然。

二、Binlog

Redo Log 解决了本地数据(这里是指单点实例)一致性的问题。但是数据库要做到高可用,还需要考虑多副本或跨区跨地域容灾。MySQL Binlog 就提供了这种能力,Binlog 支持 Statement,Row 和 Mixed 三种模式。其中, Row 模式会记录每行数据的修改操作,相比 Statement 模式,它能保证主从复制的正确性。

前面已经提到,Redo Log 和 Binlog 必须同时使用才能做到数据一致且高可用。接下来简要分析一下数据库进行插入或更新操作时是如何做到这一点的。MySQL 使用 WAL 机制进行更新操作,即先写 Redo Log 和 Binlog,然后再写数据。写 Redo Log 和 Binlog 必须保证原子性,要么都更新成功,要么都更新失败,否则会造成本地数据和其他副本数据不一致的情况。更新 Redo Log 和 Binlog 的过程称为两阶段提交,其步骤为:

  1. 先将更新的操作写到 Redo Log,此时流程标记为 prepare 状态;

  2. 更新 Binlog,此时需将 BinLog 刷回磁盘才能视为成功;

  3. 提交事务(此时还会清除该事务 Undo 日志),流程标记为 commit 状态。

两阶段提交可以保证数据的一致性,它在任何一个阶段异常失败都可以进行恢复。比如,如果事务已经是 commit 状态,此时Redo Log 和 Binlog 都已更新成功;如果是在 prepare 状态,此时就需要判断 BinLog 中是否有完整的信息,如果有,则会进行 commit,如果没有完整信息,则整个事务回滚。

感谢各位的阅读,以上就是“InnoDB的外存数据结构介绍”的内容了,经过本文的学习后,相信大家对InnoDB的外存数据结构介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: InnoDB的外存数据结构介绍

本文链接: https://www.lsjlt.com/news/60149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • InnoDB的外存数据结构介绍
    这篇文章主要讲解了“InnoDB的外存数据结构介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“InnoDB的外存数据结构介绍”吧!PartⅠ 表和表空间“...
    99+
    2024-04-02
  • C#中的数据结构介绍
    一、数组(Array) 数组具有以下的特点: 数组属于线性结构,在内存中是连续存放的。数组的元素类型必须相同。数组可以直接通过下标访问。数组的查找速度非常快,新增和删除速度慢。数组在...
    99+
    2024-04-02
  • PostgreSQL中结合实际的内存数据介绍相关数据结构
    小编给大家分享一下PostgreSQL中结合实际的内存数据介绍相关数据结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据结构   typedef st...
    99+
    2024-04-02
  • 【Java 数据结构】TreeMap和TreeSet的介绍
    目录 1、认识 TreeMap 和 TreeSet 2、TreeMap 的主要成员变量 3、TreeMap 的主要构造方法 4、TreeMap 和 TreeSet 的元素必须可比较 5、TreeMap 和 TreeSet 关于 key...
    99+
    2023-09-04
    数据结构 TreeMap TreeSet
  • 【Java 数据结构】Map和Set的介绍
    目录 1、Map 和 Set 的概念 2、模型 3、Map 的学习 3.1 关于 Map.Entry 3.2 Map 的常用方法 4、Set 的常用方法  5、 Map 和 Set 的注意点 1、Map 和 Set 的概念 Java...
    99+
    2023-09-11
    数据结构
  • Java中LinkedList数据结构的详细介绍
    目录1.介绍2.Java 链表的方法3.代码1.介绍 Linked List 是 java.util 包中 Collection 框架的一部分。LinkedList 数据结构的实现,...
    99+
    2023-05-18
    Java LinkedList LinkedList 数据结构
  • MySQL的InnoDB存储引擎的数据页结构详解
    目录1 InnoDB页的概念2 数据页的结构3 记录在页中的存储4 Page Directory页目录5 File Header文件头部6 InnoDB页和记录的关系7 没有索引时查...
    99+
    2024-04-02
  • Oracle的体系结构和物理、逻辑存储结构介绍
    本篇内容主要讲解“Oracle的体系结构和物理、逻辑存储结构介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle的体系结构和物理、逻辑存储结构介绍”吧...
    99+
    2024-04-02
  • Mysql InnoDB 的内存结构详情
    目录1 前言2 InnoDB 存储引擎结构2.1 InnoDB表存储引擎文件2.2 InnoDB 预读机制2.3 InnoDB 特性2.3.1 插入缓存2.3.2 二次写 ...
    99+
    2024-04-02
  • Python数据结构-----栈1.0(栈的介绍与操作)
    目录 前言: 栈的介绍 Python栈的操作 1.创建栈 2.判断栈是否为满  3.判断栈是否为空  4.压栈 5.出栈 6.展示栈数据 7.获取到栈顶的数据 8.获取到栈的数据总数 第三方模块实现栈 下载模块: 导入模块:  使用示例: ...
    99+
    2023-10-18
    数据结构 链表 java python 高级编程
  • 数据结构C语言链表的实现介绍
    目录前言函数1. 链表初始化2. 计算链表长度3. 打印链表4.计算链表长度5. 删除链表中指定位置节点6. 向链表中指定位置插入节点7. 全代码+运行效果前言 需要用到的函数库 ...
    99+
    2024-04-02
  • C++数据封装以及定义结构介绍
    今天小编给大家分享的是C++数据封装以及定义结构介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。先介绍一个字符串比较函数:strcmp(s1,s2),当s1<s2时,返回一个...
    99+
    2023-08-03
  • mysql 体系结构和存储引擎介绍
    目录1 前言2 mysql 配置文件加载顺序3 mysql 引擎介绍3.1 InnoDB 引擎3.2 MyISAM 引擎3.3 NDB 引擎3.4 Archive 引擎3.5 Fed...
    99+
    2024-04-02
  • MySQL数据库结构和数据的导出和导入方法介绍
    这篇文章主要讲解了“MySQL数据库结构和数据的导出和导入方法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库结构和数据的导出和导入方法介...
    99+
    2024-04-02
  • 有意思的数据结构默克树Merkletree应用介绍
    目录一种有意思的数据结构-默克树(Merkle tree)长什么样子?Hash链表防篡改判断某个交易是否被记录(是否存在)常见应用 - 1 git常见应用 - 2 分布式数据存储的数...
    99+
    2024-04-02
  • 怎么理解MySQL InnoDB的存储结构
    这篇文章将为大家详细讲解有关怎么理解MySQL InnoDB的存储结构,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 从物理意...
    99+
    2024-04-02
  • Mysql InnoDB引擎中的数据页结构详解
    目录Mysql InnoDB引擎数据页结构一、页的简介二、数据页的结构三、记录在页中的存储结构四、记录头信息1. deleted_flag2. min_rec_flag3. n_ow...
    99+
    2024-04-02
  • Python内置数据结构列表与元组的详细介绍
    本篇内容介绍了“Python内置数据结构列表与元组的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录 序列 列表1 列表的特性1....
    99+
    2023-06-20
  • 如何理解MySQL数据库Innodb内存结构以及怎样使用内存的
    如何理解MySQL数据库Innodb内存结构以及怎样使用内存的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述很多朋友可能会有许多关于I...
    99+
    2024-04-02
  • java数据结构中单向链表和双向链表的介绍
    这篇文章主要讲解了“java数据结构中单向链表和双向链表的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java数据结构中单向链表和双向链表的介绍”吧!目录单向链表单链表图解代码双向链表...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作