MySQL中的数据目次(简介-数据的家)

[复制链接]
发表于 2026-1-25 12:09:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
 
1 数据库和文件体系的关系
2 MySQL数据目次
2.1 数据目次和安装目次的区别
2.2 怎样确定MySQL中的数据目次
3 数据目次的布局
3.1 数据库在文件体系中的体现
3.2 表在文件体系中的体现
3.2.1 InnoDB是怎样存储表数据的
3.2.2 MyISAM是怎样存储表数据的
3.3 视图在文件体系中的体现
3.4 其他的文件
4 文件体系对数据库的影响
5 MySQL体系数据库简介
6 参考册本


 

1 数据库和文件体系的关系

我们知道像 InnoDB 、 MyISAM 如许的存储引擎都是把表存储在磁盘上的,而操纵体系用来管理磁盘的谁人东东又被称为文件体系 ,以是用专业一点的话来表述就是:像InnoDB 、 MyISAM如许的存储引擎都是把表存储在文件体系上的。当我们想读取数据的时间,这些存储引擎会从文件体系中把数据读出来返回给我们,当我们想写入数据的时间,这些存储引擎会把这些数据又写回文件体系。本章就是要絮聒一下 InnoDB 和 MyISAM 这两个存储引 擎的数据如安在文件体系中存储的。
2 MySQL数据目次

MySQL服务器步调在启动时会到文件体系的某个目次下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目次下的某些文件中,这个目次就称为数据目次 ,我们下边就要详细唠唠这个目次下详细都有哪些紧张的东西。 
2.1 数据目次和安装目次的区别

我们之前只打仗过 MySQL 的安装目次(在安装 MySQL 的时间我们可以自己指定),我们重点夸大过这个 安装目次 下非常紧张的 bin 目次,它里边存储了许多关于控制客户端步调和服务器步调的下令(许多可实验文件,比 如 mysql , mysqld , mysqld_safe 等等等等好几十个)。而数据目次是用来存储 MySQL 在运行过程中产生的 数据,肯定要和本章要讨论的安装目次区别开!肯定要区分开!肯定要区分开!肯定要区分开! 
2.2 怎样确定MySQL中的数据目次

到底 MySQL 把数据都存到哪个路径下呢?着实 数据目次 对应着一个体系变量 datadir ,我们在使 用客户端与服务器创建毗连之后检察这个体系变量的值就可以了:
  1. mysql> SHOW VARIABLES LIKE 'datadir';
  2. +---------------+-----------------------+
  3. | Variable_name | Value |
  4. +---------------+-----------------------+
  5. | datadir | /usr/local/var/mysql/ |
  6. +---------------+-----------------------+
  7. 1 row in set (0.00 sec)
复制代码
 从效果中可以看出,在我的盘算机上 MySQL 的数据目次就是 /usr/local/var/mysql/ ,你用你的盘算机试试呗~
3 数据目次的布局

MySQL 在运行过程中都会产生哪些数据呢?固然会包罗我们创建的数据库、表、视图和触发器吧啦吧啦的用户数据,除了这些用户数据,为了步调更好的运行, MySQL 也会创建一些其他的额外数据,我们接下来细细的品味一下这个 数据目次 下的内容。
3.1 数据库在文件体系中的体现

每当我们利用 CREATE DATABASE 数据库名 语句创建一个数据库的时间,在文件体系上实际发生了什么呢?着实很简单,每个数据库都对应数据目次下的一个子目次,大概说对应一个文件夹,我们每当我们新建一个数据库时, MySQL 会帮我们做这两件事:
1. 在 数据目次 下创建一个和数据库名同名的子目次(大概说是文件夹)。
2. 在该与数据库名同名的子目次下创建一个名为 db.opt 的文件,这个文件中包罗了该数据库的各种属性,比方说该数据库的字符集和比力规则是个啥。
比方说我们检察一下在我的盘算机受骗前有哪些数据库:
  1. mysql> SHOW DATABASES;
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | charset_demo_db |
  7. | dahaizi |
  8. | mysql |
  9. | performance_schema |
  10. | sys |
  11. | xiaohaizi |
  12. +--------------------+
  13. 7 rows in set (0.00 sec)
复制代码
可以看到在我的盘算机受骗前有7个数据库,此中 charset_demo_db 、 dahaizi 和 xiaohaizi 数据库是我们自界说的,别的4个数据库是属于MySQL自带的体系数据库。我们再看一下我的盘算机上的 数据目次 下的内容:
  1. ├── auto.cnf
  2. ├── ca-key.pem
  3. ├── ca.pem
  4. ├── charset_demo_db
  5. ├── client-cert.pem
  6. ├── client-key.pem
  7. ├── dahaizi
  8. ├── ib_buffer_pool
  9. ├── ib_logfile0
  10. ├── ib_logfile1
  11. ├── ibdata1
  12. ├── ibtmp1
  13. ├── mysql
  14. ├── performance_schema
  15. ├── private_key.pem
  16. ├── public_key.pem
  17. ├── server-cert.pem
  18. ├── server-key.pem
  19. ├── sys
  20. ├── xiaohaizideMacBook-Pro.local.err
  21. ├── xiaohaizideMacBook-Pro.local.pid
  22. └── xiaohaizi
  23. 6 directories, 16 files
复制代码
固然这个数据目次下的文件和子目次比力多哈,但是假如过细看的话,除了 information_schema 这个体系数据库外,其他的数据库在数据目次下都有对应的子目次。这个 information_schema 比力特别,计划MySQL的大叔们对它的实现举行了特别对待,没有利用相应的数据库目次,我们忽略它的存在就好了哈。
3.2 表在文件体系中的体现

我们的数据着实都是以记载的情势插入到表中的,每个表的信息着实可以分为两种:
1. 表布局的界说
2. 表中的数据
表布局就是该表的名称是啥,表里边有多少列,每个列的数据范例是啥,有啥束缚条件和索引,用的是啥字符集和比力规则吧啦吧啦的各种信息,这些信息都体如今了我们的建表语句中了。为了生存这些信息, InnoDB 和 MyISAM 这两种存储引擎都在 数据目次 下对应的数据库子目次下创建了一个专门用于形貌表布局的文件,文件名是如许:
  1. 表名.frm
复制代码
比方说我们在 dahaizi 数据库下创建一个名为 test 的表:
  1. mysql> USE dahaizi;
  2. Database changed
  3. mysql> CREATE TABLE test (
  4. -> c1 INT
  5. -> );
  6. Query OK, 0 rows affected (0.03 sec)
复制代码
那在数据库 dahaizi 对应的子目次下就会创建一个名为 test.frm 的用于形貌表布局的文件。值得留意的是,这个后缀名为.frm是以二进制格式存储的,我们直接打开会是乱码的~ 你还不赶紧在你的盘算机上创建个表试试~
形貌表布局的文件我们知道怎么存储了,那表中的数据存到什么文件中了呢?在这个题目上,差别的存储引擎就产生了分歧了,下边我们分别看一下 InnoDB 和 MyISAM 是用什么文件来生存表中数据的。
3.2.1 InnoDB是怎样存储表数据的

我们前边重点絮聒过 InnoDB 的一些实现原理,到如今为止我们应该认识下边这些东东:


  • InnoDB 着实是利用 页 为根本单元来管理存储空间的,默认的页巨细为 16KB 。
  • 对于 InnoDB 存储引擎来说,每个索引都对应着一棵 B+ 树,该 B+ 树的每个节点都是一个数据页,数据页之间不须要是物理一连的,由于数据页之间有双向链表来维护着这些页的序次。
  • InnoDB 的聚簇索引的叶子节点存储了完备的用户记载,也就是所谓的索引即数据,数据即索引。 
为了更好的管理这些页,计划 InnoDB 的大叔们提出了一个 表空间 大概 文件空间 (英文名: table space 或 者 file space )的概念,这个表空间是一个抽象的概念,它可以对应文件体系上一个或多个真实文件(差别表 空间对应的文件数目大概差别)。每一个 表空间可以被分别为许多许多许多个页 ,我们的表数据就存放在某个表空间下的某些页里。计划 InnoDB 的大叔将表空间分别为几种差别的范例,我们一个一个看一下
体系表空间(system tablespace)
这个所谓的体系表空间 可以对应文件体系上一个或多个实际的文件,默认环境下, InnoDB 会在 数据目次 下创 建一个名为 ibdata1 (在你的数据目次下找找看有木有)、巨细为 12M 的文件,这个文件就是对应的体系表空间在文件体系上的体现。怎么才 12M ?这么点儿还没插多少数据就用完了,哈哈,那是由于这个文件是所谓的 自扩展文件 ,也就是当不敷用的时间它会自己增长文件巨细~
固然,假如你想让体系表空间对应文件体系上多个实际文件,大概仅仅以为原来的 ibdata1 这个文件名难听逆耳,那 可以在 MySQL 启动时设置对应的文件路径以及它们的巨细,好比我们如许修改一下设置文件:
  1. [server]
  2. innodb_data_file_path=data1:512M;data2:512M:autoextend
复制代码
如许在 MySQL 启动之后就会创建这两个512M巨细的文件作为体系表空间 ,此中的 autoextend 表明这两个文件假如不敷用会主动扩展 data2 文件的巨细。
我们也可以把体系表空间对应的文件路径不设置到数据目次下,以致可以设置到单独的磁盘分区上,涉及到的启动参数就是 innodb_data_file_path 和 innodb_data_home_dir ,详细的设置逻辑挺绕的,我们这就不多絮聒了,知道改哪个参数可以修改体系表空间对应的文件,有必要的时间到官方文档里一查就好了。
必要留意的一点是,在一个MySQL服务器中,体系表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个体系表空间。
独立表空间(file-per-table tablespace)
在MySQL5.6.6以及之后的版本中, InnoDB 并不会默认的把各个表的数据存储到体系表空间中,而是为每一个表创建一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。利用独立表空间来存储表数据的话,会在该表所属数据库对应的子目次下创建一个体现该独立表空间的文件,文件名和表名类似,只不外添加了一个 .ibd 的扩展名而已,以是完备的文件名称长如许:
  1. 表名.ibd
复制代码
比方说假如我们利用了独立表空间去存储 xiaohaizi 数据库下的 test 表的话,那么在该表地点数据库对应的 xiaohaizi 目次下会为 test 表创建这两个文件:
  1. test.frm
  2. test.ibd
复制代码
此中 test.ibd 文件就用来存储 test 表中的数据和索引。固然我们也可以自己指定利用体系表空间 照旧独立表空间来存储数据,这个功能由启动参数 innodb_file_per_table 控制,好比说我们想刻意将表数据都存储到体系表空间 时,可以在启动 MySQL 服务器的时间如许设置:
  1. [server]
  2. innodb_file_per_table=0
复制代码
当 innodb_file_per_table 的值为 0 时,代表利用体系表空间;当 innodb_file_per_table 的值为 1 时,代表利用独立表空间。不外 innodb_file_per_table 参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。假如我们想把已经存在体系表空间中的表转移到独立表空间,可以利用下边的语法:
  1. ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
复制代码
大概把已经存在独立表空间的表转移到体系表空间,可以利用下边的语法:
  1. ALTER TABLE 表名 TABLESPACE [=] innodb_system;
复制代码
此中中括号扩起来的 = 无关紧要,比方说我们想把 test 表从独立表空间移动到体系表空间,可以这么写:
  1. ALTER TABLE test TABLESPACE innodb_system;
复制代码
其他范例的表空间
随着MySQL的发展,除了上述两种老牌表空间之外,如今还新提出了一些差别范例的表空间,好比通用表空间 (general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)吧啦吧啦 的,详细环境我们就不细絮聒了,等用到的时间再提。
3.2.2 MyISAM是怎样存储表数据的

好了,絮聒完了 InnoDB 的体系表空间和独立表空间,如今轮到 MyISAM 了。我们知道不像 InnoDB 的索引和数据是一个东东,在 MyISAM 中的索引全部都是二级索引 ,该存储引擎的数据和索引是分开存放的。以是在文件体系中也是利用差别的文件来存储数据文件和索引文件。而且和 InnoDB 差别的是, MyISAM 并没有什么所谓的表空间 一说,表数据都存放到对应的数据库子目次下。假如 test 表利用 MyISAM 存储引擎的话,那么在它地点数据库对应的 xiaohaizi 目次下会为 test 表创建这三个文件:
  1. test.frm
  2. test.MYD
  3. test.MYI
复制代码
此中 test.MYD 代表 表的数据文件,也就是我们插入的用户记载; test.MYI 代表 表的索引文件,我们为该表创建的索引都会放到这个文件中。
3.3 视图在文件体系中的体现

我们知道 MySQL 中的视图着实是捏造的表,也就是某个查询语句的一个别名而已,以是在存储 视图的时间是不必要存储真实的数据的,只必要把它的布局存储起来就行了。和表一样,形貌视图布局的文件也会被存储到所属数据库对应的子目次下边,只会存储一个 视图名.frm 的文件。
3.4 其他的文件

除了我们上边说的这些用户自己存储的数据以外, 数据目次下还包罗为了更好运行步调的一些额外文件,紧张包罗这几种范例的文件:


  • 服务器进程文件
我们知道每运行一个 MySQL 服务器步调,都意味着启动一个进程。 MySQL 服务器会把自己的进程ID写入到一个文件中。


  • 服务器日记文件
在服务器运行过程中,会产生各种各样的日记,好比通例的查询日记、错误日记、二进制日记、redo日记吧啦吧啦各种日记,这些日记各有各的用途,我们之后会重点絮聒各种日记的用途,如今先相识一下就可以了。


  • 默认/主动天生的SSL和RSA证书和密钥文件
紧张是为了客户端和服务器安全通讯而创建的一些文件, 各人看不懂可以忽略~
4 文件体系对数据库的影响

由于 MySQL 的数据都是存在文件体系中的,就不得不受到文件体系的一些制约,这在数据库和表的定名、表的巨细和性能方面体现的比力显着,好比下边这些方面:


  • 数据库名称和表名称不得高出文件体系所答应的最大长度
每个数据库都对应数据目次的一个子目次,数据库名称就是这个子目次的名称;每个表都会在数据库子目次下产生一个和表名同名的 .frm 文件,假如是 InnoDB 的独立表空间大概利用 MyISAM 引擎还会有别的文件的名称与表名划一。这些目次或文件名的长度都受限于文件体系所答应的长度~


  • 特别字符的题目
为了克制由于数据库名和表名出现某些特别字符而造成文件体系不支持的环境, MySQL 会把数据库名和表名中全部除数字和拉丁字母以外的全部字符在文件名里都映射成 @+编码值的情势作为文件名。比方说我们创建的表的名称为 'test?' ,由于 ? 不属于数字大概拉丁字母,以是会被映射成编码值,以是这个表对应的 .frm 文件的名称就酿成了 [email protected] 。 


  • 文件长度受文件体系最大长度限定
对于 InnoDB 的独立表空间来说,每个表的数据都会被存储到一个与表名同名的 .ibd 文件中;对于 MyISAM 存储引擎来说,数据和索引会分别存放到与表同名的 .MYD 和 .MYI 文件中。这些文件会随着表中记载的增长而增大,它们的巨细受限于文件体系支持的最大文件巨细
5 MySQL体系数据库简介

我们前边提到了MySQL的几个体系数据库,这几个数据库包罗了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息,我们如今轻微相识一下


  • mysql
这个数据库贼焦点,它存储了MySQL的用户账户和权限信息,一些存储过程、变乱的界说信息,一些运行过程中产生的日记信息,一些资助信息以实时区信息等


  • information_schema
这个数据库生存着MySQL服务器维护的全部其他数据库的信息,好比有哪些表、哪些视图、哪些触发器、哪些列、哪些索引吧啦吧啦。这些信息并不是真实的用户数据,而是一些形貌性信息,偶然候也称之为元数据


  • performance_schema
这个数据库里紧张生存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控监控。 包罗统计迩来实验了哪些语句,在实验过程的每个阶段都耗费了多长时间,内存的利用环境等等信息


  • sys
这个数据库紧张是通过视图的情势把 information_schema 和 performance_schema 连合起来,让步调员可以 更方便的相识MySQL服务器的一些性能信息
啥?这四个体系数据库这就先容完了?是的,我们的标题写的就是简介嘛!假如真的要絮聒一下这几个体系库的利用,那怕是又要写一本书了... 这里只是由于先容数据目次里碰到了,为了内容的完备性跟各人提一下,详细怎样利用照旧要参照文档~
6 参考册本

《MySQL是怎样运行的:从根儿上明确MySQL》小孩子4919 著
这本誊写得非常好,保举口试的小搭档偶然间可以去相识一下,对明确MySQL的资助很大
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表