暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql的数据到底是怎么存的(上)|mysql系列(4)

小汪哥写代码 2021-07-06
507

前言

一个优秀的数据库,必然涉及到持久化,有持久化,就有数据落盘的操作。有落盘操作就必然有文件存储的位置规划。而且了解数据库的持久化文件也是了解数据库高可用,可扩展的前提。像Hbase,redis,rocksdb,tidb等数据库都有相通的地方,这个后面有时间分享。


InnoDB是一个将表中的数据存储到磁盘上的存储引擎 。这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

也是mysql 持久化的保证 ,InnoDB  引擎是怎么组织数据的呢?这就要了解innodb 文件存储结构。


数据存储的位置

数据是存储在数据目录中的,数据目录是用来存储MySQL在运行过程中产生的数据,和mysql 的数据安装目录是两个概念。我们可以通过下面的语句来查看。

    SHOW VARIABLES LIKE 'datadir';

    数据库表和文件系统的对应关系

    其实每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹。

    当我们创建数据库时,mysql会帮我们做两件事:


    • 在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。

    • 在该与数据库名同名的子目录下创建一个名为db.opt的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集、比较规则等。

    比如看看我现在的机器上有哪些数据库:

    以及对应文件系统对应的位置:

    磁盘视角

    从磁盘的视角来看,物理存储主要为系统表空间、独立表空间、通用表空间、undo表空间、redo log;



    系统表空间(system tablespace)

    系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1(在你的数据目录下找找看有木有)、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是自扩展文件。在一个MySQL服务器中,系统表空间只有一份。


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

    InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:

      表名.ibd


      假如我们使用了独立表空间去存储demo数据库下的test表的话,那么在该表所在数据库对应的demo目录下会为test表创建这两个文件:


        test.frmtest.ibd

        其中test.ibd文件就用来存储test表中的数据和索引.然我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。


        其他类型的表空间

        随着mysql的发展,陆续出现了通用表空间(general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)。


        mysql的架构图


        了解mysql的架构图,有助于理解innodb 引擎的几种物理文件的组成。


        以上,是我对mysql 物理存储的理解。


        欢迎拍砖留言交流,如果你觉得还不错,可以帮忙点个赞,加个关注,谢谢!

        当然也可以关注我的公众号[小汪哥写代码]


        参考资料

        MySQL技术内幕-InnoDB存储引擎(姜承尧)




        文章转载自小汪哥写代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论