MySQL学习-数据目录(二)

55 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据目录。有兴趣的小伙伴可以阅读(# MySQL学习-数据目录(一))。
下面我们继续学习MySQL中的数据目录。

数据目录

表在文件系统的表示

InnoDB存储引擎模式

表结构

为了保存表结构,InnoDB在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名如:表名.frm。

假如testdb数据库下创建一个test的表,那在数据库testdb对应的子目录下就会创建一个名为test.frm的用于描述表结构的文件。.frm文件的格式在不同的平台上是相同的。这个后缀名为.frm是以二进制格式存储的,我们直接打开是乱码的。

表中数据和索引

  • 系统表空间:默认情况下,InnoDB会在数据目录下创建一个名为ibdata1,大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。怎么才12M?注意这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。当然,如果想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的ibdata1这个文件名不好,那可以在MySQL启动时配置对应的文件路径以及他们的大小,比如我们这样修改以下my.cnf配置文件:
[server]
innodb_data_file_path=data1:512M;data2:autoextend
  • 独立表空间:在MySQL5.6.6(含)之后的版本中,InnoDB并不会默认把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说创建了多少表,就有多少个独立表空间。使用独立表空间存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,如:表名.ibd。
  • 系统表空间和独立表空间的设置:可以指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制,比如想将表数据都存储到系统表空间时,可以在启动MySQL服务器时配置:
[server]
innodb_file_per_table=0;
#这里,0:表示使用系统表空间;1:表示使用独立表空间
  • 其他类型表空间:通用表空间,临时表空间等。

MyISAM存储引擎模式

表结构

MyISAM与InnoDB一样,也是在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:表名.frm。

表中数据和索引

在MyISAM中的索引全是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件,同时表数据都存放在对应的数据库子目录下。假如test表使用MyISAM存储引擎的话,它所在的数据库对应的testdb目录下会为test表创建三个文件:

test.frm 存储表结构
test.MYD 存储数据 (MYData)
test.MYI 存储索引 (MYIndex)

举例一

创建test2表,使用ENGINE选项显式指定引擎。默认InnoDB是默认引擎。

CREATE TABLE test2(
    id INT NOT NULL AUTO_INCREMENT
)ENGINE=MYISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb3;

今天先学习到这里,明天继续。