Mysql和文件系统的关联详情
前言
在Linux中采用文件系统管理磁盘,而Mysql常用的存储引擎如InnoDB、MyISAM采用的是文件存储,自然和文件系统挂钩,那么Mysql都有哪些地方用到了文件系统呢?下面聊聊
Mysql数据目录
Mysql系统启动文件(默认my.cnf)中可能会指定Mysql的一个全局系统变量datadir,这个变量可以指定Mysql的数据存储目录,
如下:
或者采用查询变量的形式获取(下面所有演示截图都是从这个目录出发)
+—————+——————————-+
| Variable_name | Value |
+—————+——————————-+
| datadir | /usr/local/mysql-5.7.26/data/ |
+—————+——————————-+
1 row in set (0.00 sec)
数据目录相关结构
数据库存储结构
每创建完一个数据库会在预定义的datadir路径下创建一个以数据库名同名的文件夹
Query OK, 1 row affected (0.00 sec)
创建完test_data文件夹,会在该文件夹下创建一个db.opt的文件,该文件用于存放数据库的属性如字符集和比较规则。
有一点我们需要注意系统自带的数据库有四个分别是mysql(存储Mysql用户权限等信息)、information_schema(其它数据库描述信息)、performance_schema(存储Mysql运行时状态等)、sys(服务器性能视图),其中除information_schema外都会创建一个文件夹。
表结构存储
如给上述创建的test_data数据库新建一个表
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会为每一个表建立一个独立的空间,有多少个表就有多少个独立空间,所以当我们执行建表语句
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:存储表索引。
如下创建测试表:
`name` varchar(100) DEFAULT NULL
) ENGINE=MyISAM
特殊视图存储
因为视图本质就是虚拟表,仅仅是查询语句的别名,存储时不保存视图的数据,仅仅只保存视图的表结构,所以创建视图仅仅会创建一个与视图同名的frm文件。
到此这篇关于Mysql和文件系统的关联详情的文章就介绍到这了,更多相关Mysql文件系统内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!