《从根上理解MySQL是怎样运行的》第八章学习笔记

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

数据库和空间系统的关系

存储引擎将表存储在磁盘上,磁盘是由操作系统管理的,也就是文件系统来管理磁盘。

读取数据和写数据都需要走存储引擎,存储引擎操作文件系统来完成数据的处理

也就是: 数据请求 -》 存储引擎 -〉 文件系统 -》 得到结果 -〉 返回给用户


MySQL数据目录

MySQL服务器启动的时候会到文件系统中的某个目录下加载一些文件,之后运行中产生的文件都会存储到这个目录下的某些文件中。这个目录就是数据目录

个人思考:这个数据目录就是一个打杂的感觉哈哈哈💦


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

安装目录是安装的时候默认的路径或者指定的目录,安装目录的重点是bin目录中的可执行文件。

数据目录是存储MySQL中运行产生的数据,和安装目录一定要区分。


如何确定MySQL中的数据目录

MySQL到底存放到哪里呢?数据目录对应着一个系统变量datadir(英文名称直接就是数据的目录------dir),客户端建立和服务器的连接以后直接查看这个系统变量就知道存放的目录在哪里

SHOW VARIABLES LIKE 'datadir'

这样可以看到数据目录存放在哪里了

这是我的路径: /usr/local/var/mysql/


数据目录的结构

MySQL运行的时候会产生哪些数据呢?

包含用户创建的数据库,表,视图和触发器等内容。程序运行时也会创建一些其他的数据来更好的运行

总结:用户数据 + 运行中的数据

可以说这个文件夹就是我们平常意义中的"数据库"了


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

使用CREATE DATABASE 数据库名称的时候到底发生了什么?

每个数据库都对应一个子目录,或者说一个文件夹

创建的过程如下:

(1)数据目录下创建一个和数据库名同名的一个子目录,或者说是一个文件夹

(2)创建一个db.opt的文件,包含了数据库的各种属性,比如使用的字符集和比较规则

也就是创建一个文件夹来做数据库


表在文件系统中的表示

数据以记录的形式插入到表中,每个表的信息分成两种:

表结构的定义 + 表中的数据

表结构:名称 + 列 + 数据类型,等各种信息,也就是我们建表时的创建信息。存储引擎会将这些信息保存在数据目录对应表文件夹中的一个专门用户描述表结构的文件中:

表名.frm

比如创建一个test的名字的表:

于是数据库 dahaizi对应的数据目录子文件目录中就会创建一个test.frm用于描述表结构的文件


InnoDB是如何存储表数据的

先复习一些基本的原理

InnoDB :使用页作为基本单位来管理存储空间的,默认的页大小为16kb

对于InnoDB存储引擎来说一个索引对应着一个B+树,每一个节点都是一个数据页,数据页之间是双向链表的关系,在物理上不一定连续

InnoDB的聚簇索引(主键值B+树)的叶节点存储了完整的用户记录,也就是索引即数据,数据即索引的概念

用户自定义的二级辅助索引B+树中叶节点存储的是辅助列值对应的主键值,如果需要获取到完整的数据则需要通过这个主键值到B+聚簇索引中回表重新查询

为了更好地管理这些数据页,或者说索引页。设计师提出了表空间或者文件空间的概念。表空间可以对应文件系统上一个或者多个真实文件(对应数量不固定)。一个表空间可以划分成很多很多的页,于是我们的表数据就存储在这些表空间的页里面。

总结:表空间则是管理很多真实数据页的一个集合的概念。相当于集中管理一些页。

我们存放的数据都包括在表空间中


系统表空间

只要是表空间,那么就是对应的文件系统上一个或者多个实际的文件。

默认情况下InnoDB会在数据目录下创建一个名为ibdata1的文件。这也就是系统表空间在文件系统上实际表示。这个文件是可以自己扩展的,会在空间不足的时候自动增加文件大小

系统表空间是可以启动的时候自定义的,可以指定名字和路径和大小


独立表空间

InnoDB不会将表数据直接存放到系统表空间中,而是为每一个表创建一个对立表空间。创建多少个表就有多少个表空间。

使用独立表空间存放数据,那么就会在表所属数据库对应的子目录中创刊一个表示该独立表空间的文件,文件名和表名相同:

表名.ibd

如果在独立表空间中存储test表,那么在对应数据库的目录下会为test创建两个文件:

test.frm : 表的描述文件

test.ibd : 用于存储表中的数据和索引

不一定只能使用独立表空间来存储数据,还可以指定系统空间来存储表数据

还可以将系统表空间的数据转移给独立表空间,或者转回来也可以:

其他类型的表空间

现在还衍生出了通用表空间和undo表空间等概念。

总结:表空间就是来管理各种的数据页的,本质就是一个或者多个文件

它是一个概念上的仓库,存储数据最终落实到真实的文件中


文件系统对数据库的影响

文件系统会制约MySQL中的表数据

(1)数据库名称和表名称不可以超过文件系统所允许的最大长度:因为本质它们都是文件系统中的文件。

表就是操作系统中的.frm文件,数据库名称就是文件系统子目录中的名称

(2)特殊字符的问题

MySQL将库名和表名中除了数字和拉丁字母以外的所有字符都映射到兼容的形式作为文件名:

比如: test? -> test@003f.frm

(3)文件长度受文件系统最大长度限制

表中的数据是存储在和表同名的.ibd文件中的,这些文件会随着记录的增多而占用越来越多的空间。大小受限于熊支持的最大文件的大小


MySQL系统数据库简介

Myql: 存储MySQL用户信息,存储过程和事件的定义。存储一些运行时的日志信息和帮助信息等

Information-schema:保存所有数据库等信息,还有一些描述性信息,或者说元数据

performance-schema:运行过程中的状态信息保存在这里

Sys:通过视图的形式将元数据数据库和运行时的状态信息数据库保存在一起,通过这个整合的数据库可以了解服务器的性能信息


总结:本章就是介绍了数据存储是怎么落实到操作系统上的,也就是通过定义一个表空间来管理对应的数据页。

表空间对应到操作系统上就是一个文件,然后数据库对应的就是一个子目录。

数据库(子目录) -》 表(.ibd文件 + .frm描述文件)

用户数据加上运行时的一些信息一起存储在数据目录中,这个数据目录就是操作系统中真实的一个文件目录,也就是我们常说的"数据库"

数据目录 -》 各种数据库(子目录) -〉 各种表(ibd文件 + frm文件)

相关推荐
Oll Correct42 分钟前
Excel基础操作(三)
笔记·excel
o***111442 分钟前
【MySQL】MySQL库的操作
android·数据库·mysql
合作小小程序员小小店44 分钟前
桌面开发,物业管理系统开发,基于C#,winform,mysql数据库
开发语言·数据库·sql·mysql·microsoft·c#
im_AMBER1 小时前
数据结构 12 图
数据结构·笔记·学习·算法·深度优先
4***571 小时前
MySQL 数据增删改查
android·数据库·mysql
z***02601 小时前
MySQL 函数
数据库·mysql
2301_795167201 小时前
Python 高手编程系列九:上下文管理器 — with 语句
数据库·python·mysql
A***F1571 小时前
【mysql】WITH AS 语法详解
数据库·mysql
BOF_dcb1 小时前
乘法原理+除法原理
笔记