1.存储引擎:深入解析 MySQL 存储引擎与 InnoDB 文件结构

news2024/11/13 18:57:47

MySQL 提供了多种存储引擎,适用于不同的业务场景。每种引擎在文件结构上设计独特,以便优化性能和功能。本文将详细介绍 MySQL 中常用存储引擎的文件结构,尤其是 InnoDB 引擎的多种文件类型及其作用,以帮助更深入地理解和选择适合的存储引擎。


一、MySQL 存储引擎概述与常用存储引擎对比

MySQL 支持多种存储引擎,每种引擎在文件结构和特性上各具特色。以下是几种常用存储引擎及其文件结构简述:

  1. InnoDB:支持事务的默认存储引擎,使用多种文件类型保证数据的安全性与一致性。
  2. MyISAM:传统的 MySQL 存储引擎,不支持事务,文件结构简单,适合读多写少的场景。
  3. Memory:将数据存储在内存中,访问速度极快,不生成数据文件。
  4. Archive:仅支持插入和高压缩,适用于历史数据存储。

二、InnoDB 存储引擎的文件结构详解

InnoDB 是 MySQL 默认存储引擎,文件结构复杂而严谨,通过多种文件确保事务一致性和崩溃恢复能力。以下是 InnoDB 的主要文件类型及其作用:

1. 表空间文件(.ibd 文件)

.ibd 文件是 InnoDB 中每个表的独立表空间文件,保存表数据和索引。

  • 作用:存储表的数据和索引。启用独立表空间(innodb_file_per_table=ON)后,每个表的 .ibd 文件会独立存储在对应数据库的目录下。
  • 结构:文件包含数据页和索引页,采用 B+ 树结构,确保快速数据访问。
  • 优点:独立的 .ibd 文件便于表的迁移和管理。
2. 系统表空间文件(ibdata 文件)

ibdata 文件是 InnoDB 的系统表空间,存储全局元数据和部分系统信息。

  • 作用:系统表空间保存 InnoDB 的全局数据字典、双写缓冲和部分撤销日志。
  • 结构ibdata 文件包含多个内部数据页,MySQL 启动时加载这些元数据。
  • 注意:即使启用了独立表空间,ibdata 文件依旧用于存储系统元数据,不能随意删除。
3. 重做日志文件(ib_logfile

ib_logfile 是 InnoDB 的事务日志文件,用于记录已提交事务的更改。

  • 作用:记录事务的修改操作,确保崩溃恢复的持久性。
  • 结构与机制:采用预写日志(WAL)机制,事务在写入磁盘前先写入重做日志。
  • 崩溃恢复:在系统崩溃后,ib_logfile 文件用于恢复至一致状态。
4. 撤销日志文件(Undo Tablespace)

撤销日志文件记录事务的反向操作,用于事务回滚和多版本并发控制(MVCC)。

  • 作用:支持事务回滚和 MVCC,实现数据的多版本访问。
  • 存储位置:默认情况下,撤销日志写入系统表空间,但也可以配置为独立文件。
  • 高并发支持:撤销日志减少了并发读写冲突,提高了 InnoDB 的事务处理效率。
5. 二进制日志文件(Binlog)

二进制日志文件是 MySQL 的全局日志,记录所有数据修改操作,用于恢复和主从同步。

  • 作用:记录数据修改的 SQL 语句,支持故障恢复和主从复制。
  • 格式:支持三种格式:STATEMENT(SQL 语句级)、ROW(行级)和 MIXED(混合模式)。
  • 持久化支持:对于 InnoDB,二进制日志是事务持久化的重要组成部分。

三、其他常用存储引擎的文件结构对比

InnoDB 虽然是 MySQL 默认引擎,但其他存储引擎在特定场景下也具备独特优势。以下是其他常用引擎的文件结构简析:

MyISAM 文件结构

MyISAM 是 MySQL 传统存储引擎,采用较为简单的文件结构。

  • 数据文件(.MYD:存储表的实际数据。
  • 索引文件(.MYI:存储表的索引。
  • 表定义文件(.frm:保存表的结构定义。

适用场景:MyISAM 不支持事务,但查询速度快,适合读多写少的场景,如统计分析和内容管理系统。

Memory 文件结构

Memory 存储引擎将数据存储在内存中,访问速度极快,但没有持久化支持。

  • 表定义文件(.frm:存储表的结构定义,数据本身存在内存中。

适用场景:适合用于缓存和会话数据等对速度要求高但数据安全性要求不高的场景。

Archive 文件结构

Archive 引擎支持高度压缩的数据存储,主要用于归档数据。

  • 数据文件(.ARZ:存储压缩的数据。
  • 表定义文件(.frm:保存表结构定义。

适用场景:适合用于日志归档、历史数据存储等需要大量写入但极少读取的场景。


四、MySQL 5.7 与 MySQL 8.0 在文件管理上的区别

MySQL 8.0 引入了 .sdi 文件来取代 .frm 文件的部分功能,文件管理更加标准化和兼容性更好。以下是 .frm.sdi 的区别:

文件类型缩写含义版本支持内容存储位置适用存储引擎
.frmFormMySQL 5.7 及之前表结构定义(字段、索引、约束等)数据库目录中MyISAM、InnoDB 等
.sdiSerialized Dictionary InformationMySQL 8.0 及之后JSON 格式的表结构定义包含在 .ibd 文件中所有存储引擎
.frm.sdi 的关键区别
  1. 格式差异.frm 文件采用专有格式,迁移时存在兼容性问题;.sdi 文件采用 JSON 格式,更具兼容性。
  2. 使用范围:MySQL 5.7 及之前版本使用 .frm 文件来存储表结构定义信息;MySQL 8.0 之后则使用 .sdi 文件。
  3. 管理位置.frm 文件独立存储在每个数据库目录中,而 .sdi 文件包含在表的 .ibd 文件中。

五、如何查看和修改表的存储引擎

MySQL 提供了查看和更改存储引擎的便捷命令:

查看表的存储引擎
SHOW TABLE STATUS LIKE 'table_name';
修改表的存储引擎
ALTER TABLE table_name ENGINE = InnoDB;
查看支持的存储引擎
SHOW ENGINES;

六、InnoDB 逻辑存储结构

InnoDB 的逻辑存储结构分为多个层级,采用分层设计来逐级管理和存储数据,从表空间到单个记录,层层递进,每一层级都承担不同的功能。具体分为以下层级:

  1. 表空间(Tablespace)
  2. 段(Segment)
  3. 区(Extent)
  4. 页(Page)
  5. 行(Row)

1. 表空间(Tablespace)

表空间是 InnoDB 逻辑存储结构的最高层,它是数据的存储区域,可以视为数据库存储的容器。InnoDB 支持以下几种表空间:

  • 系统表空间:包含全局数据字典、undo 日志等核心数据。在未启用独立表空间时,所有表的数据也存储在系统表空间。
  • 独立表空间:如果启用 innodb_file_per_table,每个表都会分配一个独立的表空间(.ibd 文件)。
  • 临时表空间:用于存储临时数据和表,通常用于排序和查询缓存。
  • 撤销表空间(Undo Tablespace):存储事务的撤销日志,为事务回滚和多版本并发控制(MVCC)提供支持。
2. 段(Segment)

段是表空间中的一个分组,负责存储特定类型的数据。InnoDB 将不同用途的数据分成独立的段管理,常见的段包括:

  • 数据段:存储表的数据记录。
  • 索引段:存储表的二级索引信息。
  • 回滚段:存储用于事务回滚的数据(撤销日志)。

设计优点:段的划分有助于管理不同类型的数据,便于提升数据的管理效率和优化性能。

3. 区(Extent)

区是由连续的页(通常是 64 个)组成的逻辑存储单元,每个区的大小为 1MB。区的作用是提升存储管理的效率,使得数据和索引能够更高效地利用磁盘空间。

  • 分配方式:InnoDB 会将表空间中的数据划分为多个区,每个区按需分配给段。
  • 优点:减少磁盘碎片,避免小页面带来的存储开销,提升数据访问的效率。
4. 页(Page)

页是 InnoDB 逻辑存储结构的最小单位,默认大小为 16KB(可以根据需求调整)。InnoDB 中的每个数据或索引项都存储在页中。

  • 页类型:

    • 数据页:存储实际数据行。
    • 索引页:存储二级索引。
    • Undo 页:存储撤销日志。
    • 系统页:存储 InnoDB 系统数据。
  • 页结构:页采用 B+ 树结构管理,以支持高效的查找、插入、删除等操作。

设计优点:页的大小和结构设计适合 InnoDB 的数据缓存管理和快速检索,有助于提高数据访问效率。

5. 行(Row)

行是数据存储的最小单元,每一行代表数据库表中的一条记录。InnoDB 引擎的行存储格式分为以下两种:

  • 紧凑格式(Compact):只存储实际数据,节省存储空间。
  • 冗余格式(Redundant):包含更多元数据,便于兼容旧版本的 MySQL。

多版本并发控制(MVCC):InnoDB 在行级别支持 MVCC,每行记录会存储额外的隐藏列(如事务 ID、回滚指针等),以便支持快照读取和事务隔离。

七、总结

不同存储引擎的文件结构设计,使得 MySQL 能够灵活应对多种业务需求。以下是选择存储引擎的常见依据:

  • 事务支持和数据一致性要求:选择 InnoDB。
  • 读多写少、查询性能要求高:选择 MyISAM。
  • 内存速度与数据持久性不敏感:选择 Memory。
  • 高效压缩存储、历史归档:选择 Archive。

理解 MySQL 不同存储引擎的文件结构和作用,将有助于优化数据库设计,提升系统的稳定性和性能。

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

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

相关文章

JavaFX史上最全教程 - Shape - JavaFX矩形椭圆

avaFX Shape类定义了常见的形状,如线,矩形,圆,Arc,CubicCurve,Ellipse和QuadCurve。 在场景图上绘制矩形需要宽度,高度和左上角的(x,y)位置。 要在JavaFX中…

【Windows修改Docker Desktop(WSL2)内存分配大小】

记录一下遇到使用Docker Desktop占用内存居高不下的问题 自从使用了Docker Desktop,电脑基本每天都需要重启,内存完全不够用,从16g扩展到24,然后到40G,还是不够用;打开Docker Desktop 运行时间一长&#x…

使用QLoRA和自定义数据集微调大模型

大家好,大语言模型(LLMs)对自然语言处理(NLP)的影响是非常深远的,不仅提高了任务效率,还催生出新能力,推动了模型架构和训练方法的创新。尽管如此强大,但LLMs也有局限&am…

Mac M1 Docker创建Rocketmq集群并接入Springboot项目

文章目录 前言Docker创建rocketmq集群创建rocketmq目录创建docker-compose.yml新增broker.conf文件启动容器 Springboot 接入 rocketmq配置maven依赖修改appplication.yml新增消息生产者新增消费者测试发送消息 总结 前言 最近公司给配置了一台mac,正好有时间给装一…

golang分布式缓存项目 Day2

注:该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法,使之支持并发的读写。在这之…

abap 可配置通用报表字段级日志监控

文章目录 1.功能需求描述1.1 功能1.2 效果展示2.数据库表解释2.1 表介绍3.数据库表及字段3.1.应用日志数据库抬头表:ZLOG_TAB_H3.2.应用日志数据库明细表:ZLOG_TAB_P3.3.应用日志维护字段配置表:ZLOG_TAB_F4.日志封装类5.代码6.调用方式代码7.调用案例程序demo1.功能需求描述 …

材质(三)——材质参数集和材质函数

a.之前是针对材质在材质蓝图里面 类似 于静态更改的方法, b.材质参数集 ,对外开放参数,可以手动更改,已然是一种封闭的静态更改方法 c.那么材质函数,将参数集对外开放,可以在关卡蓝图 通过程序 算法 去动…

随机采样之接受拒绝采样

之前提到的逆变换采样(Inverse Transform Sampling)是一种生成随机样本的方法,它利用累积分布函数(CDF)的逆函数来生成具有特定分布的随机变量。以下是逆变换采样的缺点: 计算复杂性:对于某些分…

软件设计师:排序算法总结

一、直接插入 排序方式:从第一个数开始,拿两个数比较,把后面一位跟前面的数比较,把较小的数放在前面一位 二、希尔 排序方式:按“增量序列(步长)”分组比较,组内元素比较交换 假设…

信息安全工程师(78)网络安全应急响应技术与常见工具

前言 网络安全应急响应是指为应对网络安全事件,相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 一、网络安全应急响应技术 网络安全应急响应组织 构成:网络安全应急响应组织主要由应急领导组和应急技术支撑组构成。领导组负…

Kafka 的一些问题,夺命15连问

kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题(topics)。 消费者API 允许应用程序订阅一个或者多个主题,并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器(s…

精选5款小程序设计工具,助力设计之路璀璨前行

在当今数字化浪潮中,小程序的重要性日益凸显,无论是电商、社交还是服务领域,小程序都成为连接用户与品牌的关键桥梁。而一款优秀的小程序离不开精心的设计,以下 5 款小程序设计工具将成为你设计事业的得力助手。 一、即时设计 即…

亚马逊评论爬虫+数据分析

爬取评论 做分析首先得有数据,数据是核心,而且要准确! 1、爬虫必要步骤,选好框架 2、开发所需数据 3、最后测试流程 这里我所选框架是seleniumrequest,很多人觉得selenium慢,确实不快,仅针对此…

量子计算及其在密码学中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

论文笔记:no pose,no problem-基于dust3r输出GS参数实现unpose稀疏重建

1.摘要 我们引入了 NoPoSplat,这是一种前馈模型,能够从未设置的稀疏多视图图像中重建由 3D 高斯参数化的 3D 场景。 我们的模型专门使用光度损失进行训练,在推理过程中实现了实时 3D 高斯重建。 为了消除重建过程中对准确pose的需要&#xff…

godot--自定义边框/选中时样式 StyleBoxTexture

前提知识: stylebox就像一个贴图,把图案贴到控件是。多个stylebox同时生效的话,那当然也有层级之分,上层覆盖下层(可以设置透明度来显示下层) 关于主题的概念: godot——主题、Theme、StyleB…

ReactPress 安装指南:从 MySQL 安装到项目启动

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是一个基于 React 的开源发布平台,适用于搭建博客、网站或内容管理系统(CMS)。本文将详细介绍如何安装 ReactPress,包括…

BMC运维管理:IPMI实现服务器远控制

IPMI实现服务器远控制 实操一、使用IPMI重置BMC用户密码实操二、使用IPMI配置BMC的静态IP实操三、IPMI实现BMC和主机控制操作实操四、ipmitool查看服务器基本信息实操五、ipmitool实现问题定位BMC(Baseboard Management Controller,基板管理控制器)是服务器硬件的一个独立管…

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP?在某些特定情境下,用户可能需要切换手机的IP地址,以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例,将详细介绍手机IP地址切换的几种方法,帮助用户轻松实现这一目标。 一…

鸿蒙多线程开发——并发模型对比(Actor与内存共享)

1、概 述 并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略。 异步并发:指异步代码在执行到一定程度后会被…