目录
前言
在Linux中采用文件系统管理磁盘,而Mysql常用的存储引擎如InnoDB、MyISAM采用的是文件存储,自然和文件系统挂钩,那么Mysql都有哪些地方用到了文件系统呢?下面聊聊
Mysql数据目录
Mysql系统启动文件(默认my.cnf)中可能会指定Mysql的一个全局系统变量datadir,这个变量可以指定Mysql的数据存储目录,
如下:
或者采用查询变量的形式获取(下面所有演示截图都是从这个目录出发)
mysql> show variables like '%datadir%'; +---------------+-------------------------------+ | Variable_name | Value | +---------------+-------------------------------+ | datadir | /usr/local/mysql-5.7.26/data/ | +---------------+-------------------------------+ 1 row in set (0.00 sec)
数据目录相关结构
数据库存储结构
每创建完一个数据库会在预定义的datadir路径下创建一个以数据库名同名的文件夹
mysql> create database test_data; Query OK, 1 row affected (0.00 sec)
创建完test_data文件夹,会在该文件夹下创建一个db.opt的文件,该文件用于存放数据库的属性如字符集和比较规则。
有一点我们需要注意系统自带的数据库有四个分别是mysql(存储Mysql用户权限等信息)、information_schema(其它数据库描述信息)、performance_schema(存储Mysql运行时状态等)、sys(服务器性能视图),其中除information_schema外都会创建一个文件夹。
表结构存储
如给上述创建的test_data数据库新建一个表
CREATE TABLE test_table ( name varchar(100) DEFAULT NULL ) ENGINE=InnoDB
那么Mysql会在数据库同名文件夹也就是test_data上新建一个同表名的文件test_table.frm,这个文件用于描述表的字段,索引、约束等等
表数据存储
表数据存储不同的存储引擎,存储文件是不同的,以常用InnoDB和MyISAM举例。
InnoDB存储引擎表数据存储
InnoDB存储引擎都是以页为单位管理存储空间的,一个数据页的大小为16k,而InnoDB为了方便管理引入表空间的概念,一个表空间中可能包含多个数据页,当然表空间又分为几种如下。
系统表空间
从Mysql版本5.5.7到5.6.6之间的版本默认将表数据放入系统表空间中,在默认情况下数据目录的位置会自动生成一个文件名为ibdata1的文件,该文件大小为12M,
如下;
这个文件的大小并不是固定的,可以自增长,这意味着该文件存储不下时可以自动扩充大小。
独立表空间
在Mysql版本从5.6.6后不再存储到系统表空间,而是存储到独立表空间,独立意味着表与表之间的数据独立开来,Mysql会为每一个表建立一个独立的空间,有多少个表就有多少个独立空间,所以当我们执行建表语句
-- 默认InnoDB存储引擎 CREATE TABLE test_table ( name varchar(100) DEFAULT NULL ) ENGINE=InnoDB
会在当前数据库同名的目录下新建一个同表名的idb文件:
至于用户想选择系统表空间还是独立表空间可以由用户自己决定,通过修改系统变量innodb_file_per_table
就可以实现,为0表示使用系统表空间,为1表示使用独立表空间,这里需要注意的是修改该系统参数只对新建表生效,至于修改系统参数之前的表需要手动修改。
MyISAM存储引擎表数据存储
MyISAM的存储引擎和InnoDB存储引擎在文件系统上的最大区别就是MyISAM将索引和数据文件分开,InnoDB强调的是索引既数据,就是因为这样所以MyISAM存储引擎的表由三个文件描述
- 表名.frm:描述表结构,索引,约束等。
- 表名.MYD:存储表数据。
- 表名.MYI:存储表索引。
如下创建测试表:
CREATE TABLE `test_table_myisam` ( `name` varchar(100) DEFAULT NULL ) ENGINE=MyISAM
特殊视图存储
create view view_test as select * from test_table;
因为视图本质就是虚拟表,仅仅是查询语句的别名,存储时不保存视图的数据,仅仅只保存视图的表结构,所以创建视图仅仅会创建一个与视图同名的frm文件。