Mysql和文件系统的关联详情

目录

前言

在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文件。

原文地址:https://juejin.cn/post/7147657045678751752
21人参与, 0条评论 登录后显示评论回复

你需要登录后才能评论 登录/ 注册