首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小刘说

砥砺前行
首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 初识MySQL
  • 启动选项和系统变量
  • 字符集和比较规则
  • InnoDB记录存储结构-行
  • InnoDB记录存储结构-页
  • B+ 树索引
  • MySQL 的数据目录
    • 1. 数据目录的结构
    • 2. 数据库在文件系统中的表示
    • 3. 表在文件系统中的表示
      • 3.1. InnoDB存储表数据
      • 3.1.1. 系统表空间(system tablespace)
      • 3.1.2. 独立表空间(file-per-table tablespace)
      • 3.1.3. 其他类型的表空间
      • 3.2. MyISAM是如何存储表数据的
    • 4. 视图在文件系统中的表示
    • 5. 其他的文件
    • 6. 文件系统对数据库的影响
    • 7. MySQL系统数据库简介
  • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
小刘
2023-01-04
目录

MySQL 的数据目录

# MySQL 的数据目录

主要了解InnoDB和MyISAM这两种存储引擎的数据目录以及存储结构。

MySQL中的数据存储的位置:

SHOW VARIABLES LIKE 'datadir';
1

# 1. 数据目录的结构

# 2. 数据库在文件系统中的表示

每当我们创建一个数据库的时候,MySQL 会做这两件事儿:

  1. 在数据目录下创建一个和数据库名同名的文件夹。

  2. 在该与数据库名同名的文件夹下创建一个名为db.opt的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则。

# 3. 表在文件系统中的表示

我们的数据其实都是以记录的形式插入到表中的,每个表的信息其实可以分为两种:

  • 表结构的定义:表名称,表里边有多少列,约束条件和索引等等,数据库名同名的文件夹下有一个专门用于描述表结构的文件,名字叫表名.frm,是以二进制格式存储的。
  • 表中的数据:不同的存储引擎使用不同的方式保存保存表中数据。

# 3.1. InnoDB存储表数据

表空间:每一个表空间可以被划分为很多很多很多个页,我们的表数据就存放在某个表空间下的某些页里。表空间有几种不同的类型。

# 3.1.1. 系统表空间(system tablespace)

数据目录下有一个ibdata1、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。文件是所谓的自扩展文件。

可以修改配置文件使系统表空间,启动之后就会创建这两个512M大小的文件作为系统表空间,其中的autoextend表明自动扩展data2文件的大小:

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend
1
2

# 3.1.2. 独立表空间(file-per-table tablespace)

在MySQL5.6.6之后,InnoDB并会为每一个表建立一个独立表空间,会在该表所属数据库对应的子目录下创建一个该独立表空间的文件:表名.ibd。

手动设置表数据都存储到系统表空间,innodb_file_per_table参数只对新建的表起作用:

[server]
innodb_file_per_table=0
1
2
  • innodb_file_per_table的值为0时,代表使用系统表空间;

  • innodb_file_per_table的值为1时,代表使用独立表空间。

如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:

ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
1

或者把已经存在独立表空间的表转移到系统表空间,可以使用下边的语法:

ALTER TABLE 表名 TABLESPACE [=] innodb_system;
1

# 3.1.3. 其他类型的表空间

  • 通用表空间(general tablespace)
  • undo表空间(undo tablespace)
  • 临时表空间(temporary tablespace)

# 3.2. MyISAM是如何存储表数据的

由于MyISAM中的索引全部都是二级索引,所以该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。表数据都存放到对应的数据库子目录下。

  • 表名.frm:描述表结构的文件。
  • 表名.myd:表的数据文件。
  • 表名.myi:表数据文件中任何索引的数据树,就是索引信息文件。

# 4. 视图在文件系统中的表示

我们知道MySQL中的视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候只需要存储结构就行了。和表一样,描述视图结构的文件也会被存储到所属数据库对应的子目录下边,只会存储一个视图名.frm的文件。

# 5. 其他的文件

数据目录下还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:

  • 服务器进程文件:MySQL服务器会把自己的进程ID写入到一个文件中。

  • 服务器日志文件:常规的比如查询日志、错误日志、二进制日志、redo日志。

  • 默认/自动生成的SSL和RSA证书和密钥文件。

# 6. 文件系统对数据库的影响

由于MySQL的数据都是存在文件系统中的,就不得不受到文件系统的一些制约,这在数据库和表的命名、表的大小和性能方面体现的比较明显,比如下边这些方面:

  • 数据库名称和表名称不得超过文件系统所允许的最大长度。

  • 特殊字符:为了避免因为数据库名和表名出现某些特殊字符而造成文件系统不支持的情况,MySQL会把数据库名和表名中所有除数字和拉丁字母以外的所有字符在文件名里都映射成 @+编码值的形式作为文件名。

  • 文件大小受文件系统最大大小限制:数据和索引文件会随着表中记录的增加而增大,它们的大小受限于文件系统支持的最大文件大小。

  • 如果同时访问的表的数量非常多,可能会受到文件系统的文件描述符有限的影响。

# 7. MySQL系统数据库简介

我们前边提到了MySQL的几个系统数据库,这几个数据库包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息,我们简单了解一下。

  • mysql:存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。

  • information_schema:这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。

  • performance_schema:这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都话费了多长时间,内存的使用情况等等信息。

  • sys: 这个数据库主要是通过视图的形式把information_schema和performance_schema结合起来,让程序员可以更方便的了解MySQL服务器的一些性能信息。

上次更新: 2024/05/11, 03:55:33

← B+ 树索引

最近更新
01
kubernetes控制器-Service
08-18
02
kubernetes控制器-Deployment
08-08
03
kubernetes调度基础
07-27
更多文章>
Theme by Vdoing | Copyright © 2023-2024 本站支持IPv6访问 本站支持SSL安全访问
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式