所以MySQL对于我们来说,直观的感受就一个服务(内存结构)和一些物理文件。内存结构看不到,但是能够看到这些物理文件,所以从这里开始。
如下是一个测试环境中得到的文件列表
```sh
-rw-r----- 1 mysql mysql 56 Jan 2 2018 auto.cnf
-rw-r----- 1 mysql mysql 860 Aug 26 22:49 dev01-slow.log
drwxr-x--- 2 mysql mysql 20480 Nov 9 23:55 devopsdb
-rw-r----- 1 mysql mysql 1053 Jan 20 15:44 ib_buffer_pool
-rw-r----- 1 mysql mysql 79691776 Jan 20 15:44 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jan 20 15:46 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jan 20 15:46 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jan 20 15:46 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Sep 5 22:33 kmp
-rw-r--r-- 1 mysql mysql 531 Jan 20 15:42 my.cnf
drwxr-x--- 2 mysql mysql 4096 Sep 5 22:33 mysql
-rw-r----- 1 mysql mysql 435 Jan 20 15:44 mysql-bin.000001
-rw-r----- 1 mysql mysql 169 Jan 20 15:44 mysql-bin.000002
-rw-r----- 1 mysql mysql 150 Jan 20 15:46 mysql-bin.000003
-rw-r----- 1 mysql mysql 57 Jan 20 15:46 mysql-bin.index
-rw-r----- 1 mysql mysql 16432283 Jan 20 15:46 mysqld.log
-rw-r----- 1 mysql mysql 6 Jan 20 15:46 mysqld.pid
drwxr-x--- 2 mysql mysql 4096 Jan 2 2018 performance_schema
drwxr-x--- 2 mysql mysql 12288 Jan 2 2018 sys
drwxr-x--- 2 mysql mysql 4096 Dec 22 17:52 testdb
```
按照文件名和类型进行分类
| 文件名 | 文件类型 | 说明 |
| ------------------ | -------- | ------------------------------------------------------------ |
| performance_schema | 文件夹 | 数据库,MySQL的数据字段 |
| sys | 文件夹 | 数据库,MySQL的数据字段 |
| mysql | 文件夹 | 数据库,MySQL的数据字段 |
| testdb | 文件夹 | 数据库,存放应用数据 |
| kmp | 文件夹 | 数据库,存放应用数据 |
| devopsdb | 文件夹 | 数据库,存放应用数据 |
| my.cnf | 文件 | 参数文件,默认是从/etc/my.cnf中读取,也可以自定义 |
| mysql-bin.000001 | 文件 | 二进制日志,即binlog,数据变化都会在二进制日志里面记录 |
| mysql-bin.000002 | 文件 | 二进制日志,即binlog,数据变化都会在二进制日志里面记录 |
| mysql-bin.000003 | 文件 | 二进制日志,即binlog,数据变化都会在二进制日志里面记录 |
| mysql-bin.index | 文件 | 二进制日志序列文件,里面会记录相应的binlog名称 |
| mysqld.pid | 文件 | MySQL服务的进程号 |
| mysqld.log | 文件 | 错误日志,记录数据库启动的日志,服务端的一些日志 |
| ibtmp1 | 文件 | InnoDB临时的独立表空间 |
| ibdata1 | 文件 | 系统表空间 |
| ib_logfile1 | 文件 | InnoDB层特有的日志文件,redo文件 |
| ib_logfile0 | 文件 | InnoDB层特有的日志文件,redo文件.默认为2组,可以设置为3组 |
| dev01-slow.log | 文件 | 慢日志,应用层面出现了查询性能比较差的SQL,都会在慢日志记录下来 |
| auto.cnf | 文件 | MySQL启动时如有没有UUID,就会生成这个文件 |
| ib_butter_pool | 文件 | 5.7新特性,关闭MySQL时,会把内存中的热数据保存在这个文件,提高使用率和性能 |
查看文件夹中的文件,就会对MySQL数据存储有了一个直观的认识,比如数据库testdb中存在表t2,testdata,所在的文件夹下的文件列表如下:
```sh
-rw-r----- 1 mysql mysql 61 Jun 26 2018 db.opt
-rw-r----- 1 mysql mysql 8586 Jun 26 2018 t2.frm
-rw-r----- 1 mysql mysql 114688 Jun 26 2018 t2.ibd
-rw-r----- 1 mysql mysql 8632 Sep 3 23:16 testdata.frm
-rw-r----- 1 mysql mysql 98304 Sep 3 23:49 testdataibd
```
这两个表都是InnoDB存储引擎存储,每个表会有两类文件:.frm和.ibd,其中.frm文件存放的是表结构信息,.ibd文件存放的是表数据.
**注**:对于分区表,.ibd文件将会是多个,不过互联网行业中对于分区表使用有限。
MySQL里面的文件,大体有两个参数来做基本的控制。一个是innodb_data_file_path就是一个共享表空间,数据都往这一个文件里放(也就是ibdata1),同时undo和数据字典也会放在这里。ibdata1会持续增长,无法收缩。另外一个参数是innodb_file_per_table,通俗一些就是每一个表都有独立的文件.frm和.ibd,而且实际中使用独立表空间还是比较普遍的,在MySQL 8.0之后这种情况又有了变化。
MySQL的文件大体是这样的结构: