MySQL不同版本下表结构和数据存储总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL不同版本下表结构和数据存储总结

本文我们尝试研究MySQL在5.7和8.0版本下Innodb引擎与MyISAM引擎下数据库文件存储形式。


像InnoDB、MyISAM这样的存储引擎都是把表存储在磁盘上的,操作系统用来管理磁盘的结构被称为文件系统。换句话说,像InnoDB、MyISAM这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读取出来返回给我们。当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

【1】MySQL5.7

① InnoDB引擎

如下图所示,我们随意选择一个数据库进行查看,可以看到有三种文件形式:opt、frm、ibd。

opt: 包含了该数据库的各种属性,比如数据库的字符集和比较规则。

frm : 存放了表的结构,是一个二进制格式文件。

表结构就是该表的名称,表里面有多少列,每个列的数据类型、约束条件和索引,使用的字符集和比较规则等各种信息,这些信息都体现在了我们的建表语句中。

ibd: 独立表空间,存放了表的数据和索引。


② MyISAM

如下所示,有四种文件形式:opt、frm、MYD、MYI。可以看到与InnoDB下不同的是这里没有ibd文件而是对应拆分为了MYD和MYI。

MYD: 表数据文件。

MYI:表索引文件。

从这里也可以看出来MYISAM是把索引和数据文件分开存储,而InnoDB则索引文件即数据文件。

【2】MySQL8

① InnoDB

如下所示,只有ibd文件,没有其他。即数据库信息、表结构、表数据以及表索引均存储在ibd文件中。

d7f274151d654f84b73af8862df66735.png

② MYISAM

我们创建一个MYIASM表,插入数据,查看数据存储文件如下所示:

0518afefbe914dcdb6aef304cd10c605.png

可以看到其有三个文件:sdi、MYD、MYI。sdi相当于前面我们提到过的frm文件,也是存放表结构信息的。

③ 关于sdi

在MySQL8中我们可以看到没有了 .frm 文件,那么去了哪里呢?就放在了sdi文件中。Oracle官方(MySQL8属于Oracle旗下)将frm文件的信息以及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI)中,SDI在InnoDB下是被写在了ibd文件内部。

为了从ibd文件中提取SDI信息,oracle提供了一个应用程序ibd2sdi。这个工具不需要下载,MySQL8自带的有,只要配置好环境变量即可使用。

我们可以到存储ibd文件的目录下,执行如下命令:

ibd2sdi --dump-file=tb_sys_admin.txt tb_sys_admin.ibd

f98ce4dbcf8f4f1e8821d9cb6e177c69.png

【3】表空间

InnoDB其实是使用页为基本单位来管理存储空间的,默认的页的大小为 16KB。对于InnoDB存储引擎来讲,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序。

InnoDB的聚簇索引(也就是主键索引文件)的叶子节点存储了完整的用户记录。

为了更好的管理这些页,InnoDB提出了一个表空间或者文件空间(table space or file space)的概念。这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页,我们的表数据就存放在某个表空间下的某些页里。

① 系统表空间

默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12M的文件。这个文件就是对应的系统表空间在文件系统上的表示,其是自扩展文件,当不够用的时候会自己增加大小。


我们可以在MySQL启动时配置对应的文件路径以及它们的大小,比如my.cnf配置如下:

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

这样在MySQL启动之后就会创建这两个512M大小的文件作为系统表空间,其中autoextend表明这两个文件如果不够用会自动扩展data2文件的大小。


需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。

② 独立表空间(file-per-table-tablespace)

在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。

使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个 .ibd 的扩展名而已。

③ 系统表空间与独立表空间的设置

我们可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table来控制,比如说我们想刻意将表数据都存储到系统表空间时,可以在启动MySQL服务器的时候这样配置:

[server]
innodb_file_per_table=0 # 0 : 使用系统表空间;1 : 使用独立表空间

默认该值是1,可以使用如下命令查看:

show variables  like '%innodb_file_per_table%'

该参数的修改对新建的表起作用,对于已经分配了表空间的表并不起作用。如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:

alter table 表名 tablespace [=] innodb_file_per_table;

或者把已经存在独立表空间的表转移到系统表空间,可以使用下边的语法:

alter table 表名 tablespace [=] innodb_system;

④ 其他类型的表空间

随着MySQL的发展,除了上述两种老牌表空间之外,现在还新提出了一些不同类型的表空间,比如通用表空间(general tablespace)、临时表空间(temporary tablespace)等。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
34
分享
相关文章
vb6读取mysql,用odbc mysql 5.3版本驱动
通过以上步骤,您可以在VB6中使用ODBC MySQL 5.3驱动连接MySQL数据库并读取数据。配置ODBC数据源、编写VB6代码
85 32
MySQL版本升级(8.0.31->8.0.37)
本次升级将MySQL从8.0.31升级到8.0.37,采用就地升级方式。具体步骤包括:停止MySQL服务、备份数据目录、下载并解压新版本的RPM包,使用`yum update`命令更新已安装的MySQL组件,最后启动MySQL服务并验证版本。整个过程需确保所有相关RPM包一同升级,避免部分包遗漏导致的问题。官方文档提供了详细指导,确保升级顺利进行。
602 16
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
150 5
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
114 1
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
592 1
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
390 5
MySQL高级篇——MVCC多版本并发控制
什么是MVCC、快照读与当前读、隐藏字段、Undo Log版本链、ReadView、举例说明、InnoDB 解决幻读问题
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
671 0
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
87 0
深入解析MySQL数据存储机制:从表结构到物理存储
深入解析MySQL数据存储机制:从表结构到物理存储
952 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等