• 热门搜索 热门搜索
菜单

您现在的位置是:博客 > 文章详情文章详情

对比MySQL不同版本下表结构和数据存储的差异

原创
时间2024/05/17 11:29:20 发布 预览数量273
分类: mysql 标签: mysql

一、前言

在开始之前, 我们需要先了解一下 MySQL 的存储引擎有哪些。 MySQL常用的存储引擎有 InnoDBMyISAM,而且两者都有各自的特点,适用于不同的场景。下面是对这两种存储引擎的简要对比:

  • InnoDB存储引擎

    • 支持事务处理
    • 支持行级锁
    • 支持外键约束
    • 可以根据事务日志实现数据恢复
  • MyISAM存储引擎

    • MyISAM 的读取性能要高于 InnoDB(无事务)
    • 支持全文索引
    • 不支持事务
    • 只支持表级锁
    • 不支持外键

通过对比 InnoDBMyISAM 各自的特点,可以很明显的看到,两者特点是互补的。 这给用户很大的选择空间,可以根据需求自由选择。

从MySQL 5.5版开始,InnoDB是MySQL的默认存储引擎

二、MySQL不同版本间的差异

首先我们需要找到MySQL保存数据的文件夹,看看MySQL是如何保存数据的。可以使用 show variables like '%datadir%' 指令进行查询。

mysql> show variables like '%datadir%';
+-----------------+-------------------+
| Variable_name   | Value             |
+-----------------+-------------------+
| datadir         | /var/lib/mysql/   |
+-----------------+-------------------+
1 row in set (0.00 sec)

可以看到数据都保存在/var/lib/mysql/目录下,这个目录下有很多文件夹,并且文件夹都是以数据库名称来命名的,数据库名称下又有很多以表名称命名的文件。结构如下所示:

[root@converts data]# tree 
.
├── converts
│   ├── Menu.ibd
│   └── User.ibd

1、MySQL 5.7+

1.1、InnoDB存储引擎

# 查看InnoDB存储引擎下converts数据库的文件结构
[root@converts ~]# ll /var/lib/mysql/converts
total 20
-rw-r----- 1 systemd-coredump input  1339 May  8 12:02 db.opt
-rw-r----- 1 systemd-coredump input  17407 May  8 12:02 Menu.frm
-rw-r----- 1 systemd-coredump input  26780 May  8 12:02 Menu.ibd

如上所示,随便查询了一个数据库进行查看,InnoDB存储引擎会生成三种形式的文件:.opt.frm.ibd,每种类型的文件都有着不同的作用,如下所示:

  • opt:文件存储了表的结构定义,包括列定义、索引信息、约束条件等元数据。

  • frm:InnoDB存储引擎特有的文件,它包含了表的数据和索引信息。

  • ibd:主要用于存储数据库级别的选项设置,比如数据库的默认字符集和排序规则。

1.2、MyISAM存储引擎

# 查看MyISAM存储引擎下converts数据库的文件结构
[root@converts ~]# ll /var/lib/mysql/converts
total 20
-rw-r----- 1 systemd-coredump input  1339 May  8 12:42 db.opt
-rw-r----- 1 systemd-coredump input  12051 May  8 12:42 Menu.frm
-rw-r----- 1 systemd-coredump input  36864 May  8 12:42 Menu.MYD
-rw-r----- 1 systemd-coredump input  5356 May  8 12:42 Menu.MYI

如上所示,MyISAM存储引擎会生成种文件:.opt.frm.MYD.MYI 。其中.opt、.frm和InnoDB的方式一致。.MYD、.MYI作用如下:

  • MYD:这个文件扩展名是 “MY Data“的缩写,该文件存储了MySQL表的实际数据记录。换句话说,它是表的数据信息文件,包含了表中每一行的实际内容。

  • MYI:这个文件扩展名是 “MY Index“的缩写,这个文件包含了表的索引信息。它存储了表数据文件中任何索引的数据树结构,用于加速数据的查询操作。索引使得数据库能够快速定位到特定的数据行,而无需全表扫描。

拓展:可以看到 InnoDB存储引擎的数据和索引在同一个文件中(.ibd),而MyISAM数据和索引则分开存储(MYI、MYD),从这里可以看出来InnoDB是聚集索引、MyISAM是非聚集索引。

2、MySQL 8+

MySQL 8+版本中, 官方删除了.frm文件,并增加序列化字典信息(Serialized Dictionary Information,SDI)的文件。具体可以看官网介绍,相应官网页面如下所示:

Removal of File-based Metadata Storage

2.1、InnoDB存储引擎

# 查看InnoDB存储引擎下converts数据库的文件结构
[root@converts ~]# ll /var/lib/mysql/converts
total 11
-rw-r----- 1 systemd-coredump input  36864 May  8 15:42 Menu.ibd

如上所示:MySQL 8.0+ 版本之后, InnoDB存储引擎只会生成一个.ibd文件,该文件存储着表的数据、索引。这也就意味着每个InnoDB表都会有一个独立的.ibd文件来存储其数据和索引,从而提高了空间利用率和管理灵活性。

2.2、MyISAM存储引擎

# 查看MyISAM存储引擎下converts数据库的文件结构
[root@converts ~]# ll /var/lib/mysql/converts
total 11
-rw-r----- 1 systemd-coredump input      2003 May  9 17:24 Menu_452.sdi
-rw-r----- 1 systemd-coredump input         0 May  9 17:24 Menu.MYD
-rw-r----- 1 systemd-coredump input      1024 May  9 17:24 Menu.MYI

如上所示:MySQL 8.0+ 版本之后,MyISAM存储引擎会生成种文件:.sdi.MYD.MYI,其中 .MYD、和.MYI 和5.7+的作用一样。那么.sdi有什么作用呢?官方也给出了相应的解释~~

2.3、序列化字典信息(Serialized Dictionary Information,SDI)

MySQL 8.0+ 版本之后,官方移除了 .frm 文件,那么去了哪里呢?就放在了sdi文件中。MySQL将.frm文件信息以及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI)中,SDI在InnoDB下是被写在了ibd文件内部。为了从ibd文件中提取SDI信息,MySQL提供了一个应用程序ibd2sdi。(这个工具MySQL8+默认已经安装了。) 具体使用方法,请看官方文档:

ibd2sdi — InnoDB Tablespace SDI Extraction Utility

版权声明:本文为Converts的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.converts.cn/article/5414981.html

暂无评论

暂无评论

目录

推荐阅读

  • .net 项目发布中的 Debug和Release的区别是什么?

    ![.net 项目发布中的 Debug和Release的区别是什么?](/ArticleFile/2023-09-09/93b4042444ff40aba6e7c913250e425f.png '.net 项目发布中的 Debug和Release的区别是什么?') 一、Debug 版本 Debug 是“调试”的意思,

  • Vs2022 设置类、接口默认创建的模板

    一、前言 在团队协作中,每个人都负责这自己模块的代码。为了清楚的分辨代码是谁开发的, 我们往往会在类、接口增加一个额外的注释信息,例如:创建人、创建时间、描述等等。所以有些时候,我们希望 visual Studio 在创建类,接口的时候,生成的代码文件能更丰富一下, 例如:自动增加基础的注释功能, 类文件自动增加 p

  • 如何使用 vs 2022 远程调试 Linux系统中的Docker容器项目

    一、前言 在项目上,总会遇到一些奇怪的问题,例如:“在本地好好的, 为什么部署到线上就不行” 等等,这样的问题时长困扰着我们。但是作为一个资深的码农,“远程调试” 是一个不可或缺的手段。下面就来看下如果使用 vs 在本地远程调试部署在Linux系统中,运行在Docker容器中的项目吧。 二、远程调试 调试的前提,

  • 移除Linux系统启动时的等待时间

    一、前言 VMware 虚拟机中安装了很多Linux 系统,每次启动的时候, 都卡在系统选择的界面上,除非手动选择, 否则要等很久才会进入系统,如下图所示: ![移除Linux系统启动时的等待时间](/ArticleFile/2024-06-24/e3ab02212cc946bd9c23159895177fb3.png '移除Linux系统启动时的等待时间') 二、关闭系统等待的事件 我们

  • GitLab 私有化部署

    一、GitLab 概述 git作为目前最流行的代码管理工具,已经成为了程序员必备的技能。虽然目前有 github(对国人不太友好) 、gitee 两个比较大的代码托管平台。但是出于各种原因,搭建自己的私有代码平台也成了一部分开发人员的选择。针对这种需求,这里为大家介绍的是其中的佼佼者gitlab,也是我们公司内部正在使用的一个代码管理平台。 GitLab是一个基于Git的开源代码管理平台,它

  • 云服务器购买按量付费实例,并搭建私有网络图解

    一、前言 最近在自学 k8s 集群化部署, 奈何云服务器包年包月太贵了, 学习成本飙升。好在各大云服务商支持按量计费 , 接下来就带大家一起过一下购买流程,并且使用私有网络。 二、私有网络 在购买云服务器之前,先了解下什么是私有网络。官网给出的解释是:私有网络(Virtual Private Cloud,VPC)是一块在云服务器上自定义的逻辑隔离网络空间,可以使云服务器, 云数据库资源构建逻

  • Docker 部署FastTunnel,实现内网穿透

    一、前言 最近在学习搭建Elasticsearch集群,但是发现云服务(2核4G)资源根本就不够用,部署上去就直接宕机了。想着服务器资源太贵, 家里刚好有一台64G内存的闲置电脑。不如做一个内网穿透,可以远程访问。工作学习两不误。其实目前市面上已经有很多穿透工具了,比如向日葵~~ ,但是奈何带宽太小了,免费的才1M~~~ 二、什么是 FastTunnel FastTunnel 是用.net

  • IP地址和子网掩码的关系

    一、概述 IP地址(Internet Protocol Address)和子网掩码(Subnet Mask)是计算机网络中两个核心的概念,它们共同工作以确保数据能够正确地在复杂的网络环境中传输到目标设备。 二、IP地址 `IP地址`是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。它是一个32位的二进制数,但是在习惯上,我们

  • 修改Docker默认的存储驱动程序目录

    一、前言 今天使用jenkins对程序进行更新的时候,发现更新失败。经排查是因为系统磁盘满了,然而通过堡垒机看了下,系统空间还有很多,于是看了下系统分区: ![修改Docker默认的存储驱动程序目录](/ArticleFile/2024-06-06/444ede8a1b1b42058db18690fa995952.png '修改Docker默认的存储驱动程序目录') ![修改Docker默认

  • Windows 安装git的详细安装步骤 ,以及TortoiseGit 图形化工具

    一、前言 `Git` 是一个开源的分布式版本控制系统,用于有效、高速地处理从很小到非常大的项目版本管理。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。 二、安装Git 1、Git 下载地址 [Git 下载地址](https://git-scm.com/downloads "Git 下载地址") ![Windows

加载中