您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556
1. 简介
安装好mysql之后,我们可以通过find / -name mysql
命令查看mysql的文件或者文件夹。如下图所示,标红的部分是肯定有的。
下面就核心的目录做一个简单的介绍:
1.1. MySQL数据库文件的存放路径:/var/lib/mysql
。
上图中用红框标注的部分都是都是MySQL中的数据库:
其中:数据库demodb1,test,testdb1 三个数据库是用户自己创建的数据库。
数据库mysql,information_schema,performance_schema,sys四个数据库均是MySQL自带的数据库。后面会详细介绍。
MySQL服务器程序在启动时会到文件系统的某个系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录。
其实数据目录对应着一个系统变量datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了;
mysql> show variables like 'datadir';
1.2. 相关命令目录 /usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)
和/usr/sbin。
安装目录下非常重要的bin目录,它里面存储了许多关于控制客户端程序和服务器程序的命令(许多可执行文件,比如mysql,mysqld等)。而数据目录是用来存储MySQL在运行过程中产生的数据。
1.3. 配置文件目录
配置文件目录:/usr/share/mysql
(命令及配置文件),/etc/my.cnf
。
2. 数据库和文件系统的关系
像InnoDB、MyISAM这样的存储引擎把表存储在磁盘上的,操作系统用来管理磁盘的结构被称为文件系统,所以用专业一点的话来表述就是:像InnoDB、MyISAM这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎又会从文件系统中把数据读取出来返回给我们,我们想写入数据的时候,这些存储引擎会把这些数据又写回来文件系统。
查看一下在我的计算机里当前有哪些数据库:
mysql> show databases;
其中:数据库demodb1,test,testdb1 三个数据库是用户自己创建的数据库。
数据库mysql,information_schema,performance_schema,sys四个数据库均是MySQL自带的数据库。
数据库 | 含义 |
---|---|
mysql | 存储MySQL服务器正常运行所需要的各种信息(时区、主从、用户、权限等) |
information_schema | 提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等 |
performance_schema | 为MySQL服务器运行时状态提供了一个底层监控功能,主要用于收集数据库服务器性能参数 |
sys | 包含了一系列方便 DBA 和开发人员利用 performance_schema性能数据库进行性能调优和诊断的视图 |
2.1. mysql库的简单说明
我们可以通过show tables
命令查看某个数据库下所有数据表。
在mysql数据库中user表最常用,该表存放了所有可以操作MySQL服务器的用户信息。
2.1. information_schema库的简单说明
information_schema库主要的作用是存储数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等。
前面我们有执行show databases以及show tables 命令时实际上是从information_schema库里的对应数据表中拉取数据。
information_schema中的表保存了各种数据库信息。
数据表 | 对应的命令 | 存储内容 |
---|---|---|
ENGINES | show engines; | 数据引擎 |
SCHEMATA | show databases; | 当前用户所能看到的所有数据库 |
TABLES | show tables; | 当前用户所能看到的所有数据表 |
COLUMNS | show columns from table_name | 数据表下所有的列 |
STATISTICS | show index from table_name | 数据表下的索引 |
PROCESSLIST | show processlist | 数据表下的线程 |
2. 数据库在文件系统中的表示
使用CREATE DATABASE 数据库名 语句创建一个数据库的时候,在文件系统上实际发生了什么呢?其实,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,每当新建一个数据库时,MySQL会帮我们做这两件事儿;
- 在数据目录下创建一个和数据库同名的子目录。
- 在与该数据库名同名的子目录下创建一个名为db.opt 的文件(仅限于MySQL 5.7及之前版本),这个文件中包含了该数据库的各种属性,比如该数据库的字符集和比较规则。
2.1. 表中数据和索引
储备知识: InnoDB其实是使用页为基本单位来管理存储空间的,默认的页大小为16KB。
对于InnoDB存储引擎来说,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序。
InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。
为了更好的管理这些页,InnoDB提出了一个表空间或者文件空间(英文名:table space 或者file space)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或者多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页,我们的表空间就存放在某个表空间下的某些页里。这里的表空间有不同的类型。数据目录/var/lib/mysql
。
2.1.1. 系统表空间(system tablespace)
默认情况下,InnoDB会在数据目录下创建一个名为ibdata1
、大小为12MB的文件,这个文件就是对应的系统表空间在文件系统上的表示。怎么才12MB?注意这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。
当然,如果你想让系统表空间对应系统上多个实际文件,或者仅仅觉得原来的ibdata1
。我们可以在MySQL启动时配置对应的文件路径以及它们的大小,比如我们可以修改一下 my.cnf配置文件:
[server]
innodb_data_file_path=data1:512M;data2:512M;autoextend
这样在MySQL启动之后就会创建这两个512MB大小的文件作为系统表空间,其中的autoextend表明这两个文件如果不够用会自动扩展data2文件的大小。
2.1.2. 独立表空间(file-per-table tablespace)
在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间
,也就是说我们创建了多少个表,就有多少个独立表空间,使用独立表空间
来存储数据表的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd
的扩展名而已,所以完整的文件名称长这样。
表名.ibd
比如:我们使用了独立表空间去存储testdb1数据库下的testtable1表的话,那么在该表所在数据库对应的testdb1目录下会为testtable1表创建这两个文件:
其中:testtable1.ibd 文件就用来存储test表的数据和索引。
2.1.3. 系统表空间与独立表空间的设置
我们可以为自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数 innodb_file_per_table控制,比如说我们想可以将表数据存储到系统表空间是,可以在启动MySQL服务器的时候这样配置。
[server]
innodb_file_per_table=0 #0:代表使用系统表空间,1:代表使用独立表空间
默认情况:
说明:innodb_file_per_table 参数的修改只对新建的表起作用,对于已经分配了表空间的数据表则不起作用,如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:
ALTER TABLE 表名 TABLESPACE[=]innodb_file_per_table;
3. 总结
数据目录/var/lib/mysql
,MySQL数据库中的数据最终还是落到磁盘的文件系统中了。