1、MySQL数据目录

InnoDBMyISAM等存储引擎将MySQL实例上的表存储在操作系统维护的文件系统上,最终将数据存储在节点的磁盘上。当我们读取数据时,存储引擎会从文件系统中把数据读取上来并返回;当我们写入数据时,存储引擎会把这些数据写入到文件系统中。
MySQL服务端程序会在启动时到文件系统的某一个目录下加载配置文件my.cnf,之后在运行过程中产生的数据(比如用户新建的数据库、表等数据)也会存储在这个目录下的特定位置,这个很重要的目录就是数据目录。数据目录可以通过以下命令查看:

  1. SHOW VARIABLES LIKE 'datadir';

结果:
image.png
即在我的MySQL实例上,数据目录为:/var/lib/mysql

2、InnoDB是如何存储表数据的

2.1 数据库在文件系统中的表示

当我们创建一个数据库时,MySQL服务端程序会在数据目录下创建一个与数据库同名的子目录,并在该子目录下创建一个名为db.opt的文件,该文件包含了数据库的各种属性,比如数据库的字符集和比较规则等。

2.2 表在文件系统中的表示

表的信息可以分为两种:表结构的定义和表中存储的用户数据。下面分别介绍一下表结构的定义和表中存储的用户数据在文件系统上是如何存储的。

2.2.1 表结构定义frm文件

表结构即表的元数据,记录了该表的名称、表有多少列、每一列的数据类型、约束条件、索引和字符集比较规则等。InnoDB存储引擎会在数据目录下对应的数据库子目录下创建一个专门用于保存表结构的文件,文件名是:表名.frm。该文件是以二进制格式存储,我们如果直接用vim打开会乱码。

2.2.2 表空间

InnoDB存储引擎管理存储空间的基本单位是页,默认的页的大小是16KB。为了更好的管理这些页,InnoDB存储引擎提出了表空间(table space)的抽象概念,表空间可以理解为存储页的池子,InnoDB存储引擎中表空间主要分为两种:系统表空间(System tablespace)和独立表空间(file-per-table tablespace),表中用户的数据就存储在表空间中。
(1)系统表空间
默认情况下,InnoDB会在数据目录下创建一个名为**ibdata1**、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。该文件是自扩展文件,当不够用时会自己增加文件大小。需要注意的是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据(用户数据)都会被默认存储到系统表空间中。
(2)独立表空间
在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个**.ibd**的扩展名而已,所以完整的文件名称为:表名.ibd

3、MySQL系统数据库简介

除了用户自己在MySQL实例上创建的数据库之外,MySQL实例上还有几个MySQL的系统数据库,无论用户是否在MySQL实例上创建数据库,这几个系统数据库都存在,如下表所示:

系统数据库名称 说明
mysql 存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
information_schema 保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。
performance_schema 这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。
sys 这个数据库主要是通过视图的形式把information_schemaperformance_schema结合起来,让程序员可以更方便的了解MySQL服务器的一些性能信息。