赞
踩
我们都知道,MySQL需要支持持久化,它把数据存储在磁盘中,在操作系统中会把管理磁盘的设备叫做文件系统,对于我们研发而言,我们大多数只会关心MySQL的索引、SQL性能优化,而对于数据是怎么存储、存在哪里这类问题就像是一个黑盒。接下来,就来通过这篇文章来简要了解下吧~
我们常用的存储引擎InnoDB都是把表存储在文件系统上的(即磁盘),当需要读取数据时,InnoDB会从文件系统中把数据读取出来返回给我们;当需要写入数据时,InnoDB又会把数据写回到文件系统中,那么InnoDB存储引擎的数据是如何在文件系统中存储的呢?跟随着文字继续了解吧!
MySQL服务器在启动时,会从文件系统的某个目录中加载文件,在运行时产生的数据也会写入存储到文件系统的这个目录中,这个目录就是数据目录
MySQL数据目录对应一个系统变量 datadir , 可以通过该命令查看数据目录存储的具体位置:
show variables like 'datadir';
输出结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-METity7m-1642822232268)(https://p-bytetech.bytedance.net/tos-cn-i-vz0z6vmpra/e48da70ea55d435d871ee79774967c61~tplv-vz0z6vmpra-image.image)]
也就是说我本机的MySQL的数据目录就在/usr/local/mysql/data/
我们知道,MySQL在运行过程中会产生的数据包括:我们创建的数据库、表、视图、服务器等,此外还有MySQL为了程序更好运行而创建的额外数据,接下来,我们具体来看下数据目录下的内容~
当我们执行create database mydb
语句来创建一个数据库时,MySQL会做两个工作:
当前,通过执行show databases
命令,可以查看到
我本机创建了的数据库有:
然后我进入目录/usr/local/mysql/data/ 下查看是不是会有上面的这些文件夹:
的确,高亮的文件夹就一一对应了MySQL中的数据库。不过如果仔细看的话,information_schema其实是不存在的,由于它比较特殊,所以MySQL的设计者对它的实现进行了特殊对待,因此没有对应的数据库目录。
我们的数据其实都是以记录的形式插入到表中的,每个表的信息可以分为两种:
表结构的定义其实就是我们的DDL语句,像表的名称、表里边的列名、每个列的数据类型、约束条件和索引等各种信息。为了保存这些信息,存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名的后缀为.frm
相信对于InnoDB存储引擎,大家都挺熟悉以下几点的:
为了更好的管理这些页,InnoDB的设计者提出了一个表空间或者 文件空间(英文名:table space或file space)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页,我们的表数据就存放在某个表空间下的某些页里。表空间划分为几种不同的类型,我们一个一个看一下。
系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下, InnoDB会在数据目录下创建一个名为ibdata1、大小为 12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是可以自扩展的,当不够用的时候它会自己增加文件大小。需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。
在MySQL5.6.6以及之后的版本中, InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:
表名.ibd
随着MySQL的发展,除了上述两种表空间之外,现在还新提出了一些不同类型的表空间,比如通用表空间 (general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)等,具体就不一一细说咯。
在MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。而且和InnoDB不同的是,MyISAM并没有什么所谓的表空间一说,表数据都存放到对应的数据库子目录下。假如 test表使用MyISAM存储引擎的话,那么在它所在数据库对应的 testDB目录下会为test表创建这三个文件:
test.frm
test.MYD
test.MYI
其中test.MYD代表表的数据文件,也就是我们插入的用户记录;test.MYI代表表的索引文件,我们为该表创建的索引都会放到这个文件中。
像视图文件、服务器进程文件、服务器日志文件、默认/自动生成的SSL和RSA证书和密钥文件这些文件都存在数据目录中,具体的文件特性这里就不一一展开咯。
因为MySQL的数据都是存在文件系统中的,就不得不受到文件系统的一些制约,这在数据库和表的命名、表的大小和性能方面体现的比较明显,比如下边这些方面:
除了我们用户创建的数据库,MySQL会自带一些系统数据库,让我们来简要介绍下吧~
关于MySQL数据存储与文件系统的关系的内容就写到这里咯,主要参考了《MySQL是怎样运行的:从根儿上理解MySQL》,大家有兴趣也可以去看看,我个人觉得写得蛮好的,浅显易懂哈哈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。