当前位置: 首页 > article >正文

第 8 章 数据的家——MySQL的数据目录

8.1 数据库和文件系统的关系

数据库把表存储在文件系统上。当我们读取数据时,存储引擎会从文件系统中把数据读出来返回给我们;当我们写入数据时,存储引擎会把这些数据写回文件系统。

8.2 MySQL数据目录

8.2.1 数据目录和安装目录的区别

数据目录是用来存储MySQL在运行过程中产生的数据。

8.2.2 如何确定MySQL中的数据目录
SHOW VARIABLES LIKE 'datadir';

在这里插入图片描述

8.3 数据目录的结构

8.3.1 数据库在文件系统中的表示

在MySQL中,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹。当我们创建一个数据库时,MySQL会:

  1. 在数据目录下创建一个和数据库同名的子目录
  2. 在该目录下创建一个名为db.opt的文件,包含了该数据库的各种属性,比如字符集和比较规则

PS:MySQL 8 引入了新的系统表格,取消了原有的db.opt文件。在 MySQL 8 中,数据库的字符集和排序规则不再存储在数据目录中的 db.opt 文件里,而是存储在新的系统表 mysql.schemata

SELECT
  `SCHEMA_NAME`,
  `DEFAULT_CHARACTER_SET_NAME`,
  `DEFAULT_COLLATION_NAME`
FROM
  `information_schema`.`SCHEMATA`
WHERE
  `SCHEMA_NAME` = 'your_database_name';
8.3.2 表在文件系统中的表示

每个表的信息可以分为两种:

  1. 表结构的定义
  2. 表中的数据

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

PS:MySQL8.0中不再单独提供表名.frm,而是合并在表名.ibd文件中。

8.3.2.1 InnoDB是如何存储表数据的

表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页,表数据就存储在某个表空间下的某些页中。表空间分为以下几类:

  1. 系统表空间(system tablespace)

    系统表空间对应文件系统上一个或多个实际的文件。默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的大小为12M的自扩展文件,就是对应的系统表空间在文件系统上的表示。MySQL5.5.7-5.6.6之间的各个版本,表中的数据都会被默认存储到穿上系统表空间。

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

    在MySQL5.6.6以及之后的版本中,InnoDB不会默认地把所有表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是有多少表就有多少表空间,文件名:表名.idb

  3. 其他类型的表空间

    通用表空间(general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)等。

8.3.2.2 MyISAM是如何存储表数据的

MyISAM的表数据都存放到对应的数据库子目录下,比如表test使用MyISAM存储引擎,则有:

  1. test.frm,表结构
  2. test.MYD,表数据
  3. test.MYI,索引
8.3.3 视图在文件系统中的表示

视图不需要存储真实的数据,只需要把它的结构存储起来,在数据库对应的子目录下,视图名.frm

8.3.4 其他的文件
  1. 服务器进程文件,MySQL服务器会把自己的进程ID写入到一个文件中。
  2. 服务器日志文件,比如查询日志、错误日志、二进制日志、redo日志等
  3. 默认/自动生成 的SSl和RSA证书和密钥文件

8.4 文件系统对数据库的影响

  1. 数据库名称和表名称长度受限于文件系统文件名称的最大长度
  2. 特殊字符
  3. 文件长度受限于文件系统的最大长度

8.5 MySQL系统数据库简介

SHOW DATABASES;

在这里插入图片描述

  1. mysql:存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
  2. information_schema:保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等等,这些并不是真实的用户数据,而是一些描述性信息,也被称为元数据。
  3. performance_schema:保存MySQL服务器运行过程中的一些状态信息,包括最近执行了哪些语句、执行耗时、内存使用情况等。
  4. sys:通过视图的形式把information_schema和performance_schema结合起来,方便程序员。

8.6 总结

  1. InnoDB、MyISAM会把数据存储在文件系统上
  2. 系统变量datadir表明了数据目录的路径
  3. 每个数据库对应数据目录下的一个子目录
  4. 对于InnoDB,表结构存储在表名.frm,表数据存储在表名.ibd(MySQL8后只有ibd)
  5. 对于MySQL,表结构存储在表名.frm,表数据存储在表名.MYD,索引存储在表名.MYI

http://www.kler.cn/news/283587.html

相关文章:

  • 如何使用查询路由构建更先进的 RAG
  • 绕过后端校验的策略
  • 关于el-table的show-summary,合计栏不显示以及保留两位小数问题
  • Quarkus 后端开发记录
  • matlab 采样的非周期性矩形
  • 在野漏洞的应急响应流程
  • 【drools】kie:官方仓库clone 遇到问题解决
  • 利用API接口实现商品信息自动化更新的高效策略
  • centos基础设置
  • 【面试经验】字节商业产品日常实习面经
  • MySQL给用户授权
  • k8S Deployment
  • 计算机毕业设计选题推荐-汽车租赁系统-Java/Python项目实战
  • 整理了几十家高频面试题,让你避坑软件测试公司面试的套路,收藏收藏刷起来...
  • 「OC」CAlayer——巧用动画实现一个丝滑的折叠cell
  • 云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX
  • 删除微信重复文件的简易工具
  • unreal engine5中character角色和怪物交互时发生穿模
  • Kubernetes存储Volume
  • 借题《黑神话悟空》,聊聊UE5 游戏开发中基本的 C++ 概念
  • 日常刷题(24)
  • 【为项目做准备】Linux操作系统day1
  • STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压
  • 报错:E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
  • [java][基础]ArrayList基本使用
  • NLP(三):词向量
  • 如何利用ChatGPT高效学习英语:从零基础到流利表达
  • 优化 spring boot 的启动速度
  • 打工人 Excel 插件 - 电子表格智能辅助插件正版购买
  • okhttp异步请求连接阻塞问题排查