1. 如何确定MySQL中的数据目录
MySQL把数据都存到哪个路径下呢?其实数据目录对应着一个系统变量datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了:
mysql> show variables like 'datadir';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| datadir | /usr/local/mysql/data/ |
+---------------+------------------------+
1 row in set (0.00 sec)
如上所示,我本地MySQL的安装目录为:/usr/local/mysql/data/
1.2 数据库在文件系统中的表示
每当我们使用CREATE DATABASE 数据库名语句创建一个数据库的时候,在文件系统上实际发生了什么呢?其实很简单,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,我们每当我们新建一个数据库时,MySQL会帮我们做这两件事儿
- 在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹
- 在该与数据库名同名的子目录下创建一个名为db.opt的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥
1.3 表在文件系统中的表示
在MySQL5.6.6以及之后的版本中,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:
- 表名.ibd
如下,我的本地Test数据库建了三张表:test、country、person,对应的数据库目录有三份文件:
注:对于表定义数据,在 MySQL 5.7.6 版本之前,会有表名.frm文件存储表的DDL信息,但是在MySQL 5.7.6 版本之后,表的定义信息开始被存储在数据字典中,而不再仅限于 .frm 文件。这种新的架构可以提供更好的性能和可扩展性,同时也可以降低一些特定操作的锁定粒度。因此,从这个版本开始,您可能会发现某些情况下并不会创建 .frm 文件,但是表的定义信息仍然可以通过数据字典查询到。
2.文件系统对数据库的影响
因为MySQL的数据都是存在文件系统中的,就不得不受到文件系统的一些制约,这在数据库和表的命名、表的大小和性能方面体现的比较明显,比如下边这些方面:
- 数据库名称和表名称不得超过文件系统所允许的最大长度:
每个数据库都对应数据目录的一个子目录,数据库名称就是这个子目录的名称;每个表都会在数据库子目录下产生一个和表名同名的.frm文件,如果是InnoDB的独立表空间或者使用MyISAM引擎还会有别的文件的名称与表名一致。这些目录或文件名的长度都受限于文件系统所允许的长度~
- 特殊字符的问题
为了避免因为数据库名和表名出现某些特殊字符而造成文件系统不支持的情况,MySQL会把数据库名和表名中所有除数字和拉丁字母以外的所有字符在文件名里都映射成 @+编码值的形式作为文件名。比方说我们创建的表的名称为'test?',由于?不属于数字或者拉丁字母,所以会被映射成编码值,所以这个表对应的.idb文件名称就会变为@003f.idb
- 文件长度受文件系统最大长度限制
对于InnoDB的独立表空间来说,每个表的数据都会被存储到一个与表名同名的.ibd文件中;对于MyISAM存储引擎来说,数据和索引会分别存放到与表同名的.MYD和.MYI文件中。这些文件会随着表中记录的增加而增大,它们的大小受限于文件系统支持的最大文件大小。
3. MySQL系统数据库简介
我们前边提到了MySQL的几个系统数据库,这几个数据库包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息,我们现在稍微了解一下
-
mysql 这个数据库贼核心,它存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等
-
information_schema 这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引吧啦吧啦。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。
-
performance_schema 这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。
-
sys 这个数据库主要是通过视图的形式把information_schema 和performance_schema结合起来,让程序员可以更方便的了解MySQL服务器的一些性能信息