数据库与文件系统的关系
我们知道,InnoDB、MyISAM这样的存储引擎都是把表存储在磁盘上,而操错系统又是使用文件系统来管理磁盘,所以像InnoDB、MyISAM这样的存储引擎都是把数据存储在文件系统上,当我们想读取数据段额时候,这些存储引擎会从文件系统中把数据读出来给我们,当我们想写入数据的时候,这些存储引擎会把这些数据写回文件系统。
接下来就要说下InnoDB、MyISAM两个存储引擎的数据是如何在文件系统中存储的。
MySQL数据目录
mysql服务器程序在启动时,会在文件系统的某个目录下家在一些数据,之后在运行过程中产生的数据也会存储到这个目录下的某个文件中。这个目录就称为数据目录。
数据目录与安装目录的区别
MySQL的安装目录下游非常重要的bin目录,他里面存储了很多用来控制客户端程序和服务器程序的命令(许多可执行文件,比如mysql、mysql的、mysqld_safe等)。而数据目录是用来存储MySQL在运行过程中产生的数据。
如何确定mysql中的数据目录
其实数据目录对应着一个系统变量datadir,在客户端与服务端建立连接后,查看变量值就知道了 。
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| datadir | /usr/local/var/mysql/ |
+---------------+-----------------------+
上述查询结果中可以看出,在我的计算机中,MySQl的数据目录是/usr/local/var/mysql/ 。
数据目录的结构
MySQl在运行过程中会产生很多数据,包括我们创建的数据库、表、视图和触发器等用户数据,除了这些数据,为了保证程序的运行,MySQL也会创建一些额外的数据。
数据库在文件系统中的表示
当我们使用 " CREATE DATABASE 数据库名 " 语句创建要提个数据库时,MySQL会为我们做两件事
- 在数据目录下创建一个与数据库同名的子目录(或者说是文件夹)
- 在与该数据库同名的子目录下创建一个名为db.opt的文件,这个文件中包含了改数据库的一些属性,比如字符集和比较规则等。
表在文件系统中的表示
我们的数据其实都是以记录的形式插入到表中的,每个表的信息可以分为两种:
- 表结构的定义;
- 表中的数据。
表结构就指的是表的名称,表的列,每个列的类型,约束条件,索引,字符集等等各种信息,这些信息都体现在了我们的建表语句中,为了保存这些信息 InnoDB和MyISAM这两种存储引擎都在数据目录下对应的数据库子目录中创建了一个专门用于描述表结构的文件,文件名是这样的:表名.frm
但是需要注意的一点是,这个.frm文件是二进制格式存储的,直接打开会显示乱码。
InnoDB存储引擎是如何保存表中的数据的。
回忆一下InnoDB的一些实现原理:
- InnoDB是以页尾基本单位来管理存储空间的,默认的页大小是16KB。
- 对于InnoDB存储引擎来说,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页。数据页之间没有必要是物理连接的,数据页之间有双向链表来维护这些页的顺序。
- InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的“索引即数据,数据即索引”
为了更好的管理这些数据页,就提出了表空间或者文件空间的概念,这个表空间是个抽象的概念,他可以忒硬文件系统上一个或者多个文件。每个表空间可以被划分为多个数据页。表数据就存放在某个表空间下的某些页中。InnoDB将表空间划分为几种不同的类型:
-
1、系统表空间:
在默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12MB的文件,这个文件就是对应的系统表空间在文件系统上的表示。该文件可是自扩展文件,当不够用时可以自动增加文件大小。
在MySQl服务器中,系统表空间只有一份,表中的数据会默认存储到这个表空间中。 -
2、独立表空间
在MySQL5.6.6以及以后的版本中,InnoDB不再默认把各个表的数据存储在系统表空间中,而是为每一个表建立一个独立表空间,在使用独立表空间来存储表数据的时候,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,其文件名和表名相同,只不过添加了一个**.ibd扩展名**。
假如我们创建了一个test表,那么再其相应目录下会有两个文件: test.frm test.ibd
其他文件
除了上述用户自己存储的数据外,数据目录下还包含了一些确保程序更好运行的额外的文件,主要包括以下几种类型的文件:
- 服务器进程文件:每运行一个mysql服务器程序,都意味着启动了一个进程,mysql服务器会把自己的进程ID写入到这个文件中
- 服务器日志文件:在服务器运行期间,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo日志等。
- SSL和RSA证书与密匙文件:主要为客户端和服务器安全通信而创建的一些文件。
文件系统对数据库的影响
因为MySQL的数据是存储在文件系统中,因此就不得不受到文件系统的一些制约,这些在数据库和表的命名、表的大小和性能等方面具有明显的体现。
- 数据库名称和表明成不得超过文件系统所允许的最大长度
- 为了避免因为数据库名和表名出现某些特殊字符而造成文件系统不支持的情况,MySQL会把数据库名和表名中所有除数字和拉丁字母外地额任何字符在文件名中映射成@ + 编码值的格式。例如test?的表名 会变成test@003f.frm
- 文件长度受文件系统最大长度的限制
MySQL系统数据库简介
- mysql:这个数据库相当重要,他存储了MySQL的用户账户信息和权限信息、一些存储过程和事件的定义信息、一些运行过程中产生的 日志信息、一些帮助信息以及时区信息等。
- information_schema:这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、那些触发器、哪些列、哪些索引等。这些信息并不是真实的用户数据,而是一些描述性信息,也称之为元数据。
- performance_schema:这个数据库主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。它包含的信息由统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存使用情况等。
- sys:这个数据库主要是通过视图的形式把information_schema和performance_schema结合起来,让开发人员更方便的了解MySQL的性能信息。