MySQL文件体系
MySql文件体系主要分为:
- 参数文件
参数文件的定义是作为存储MySql初始化参数的作用,负责记录各种参数 - 日志文件:
这里的日志文件主要是系统操作日志,主要有错误日志文件,二进制日志文件,慢查询日志文件等 - socket文件:
UNIX域套接字所需文件 - pid文件
MySql实例进程的ID文件 - MySQL表结构文件
用来存放MySQL表结构定义文件 - 存储引擎文件
存储引擎文件存放了真正的记录和索引数据
主要关心的是日志文件和存储引擎文件
日志文件
日志文件主要有错误日志,二进制日志,慢查询日志,查询日志文件
二进制日志就是bin_log文件,会记录所有对MySql数据库执行更新的操作,就算最后数据未发生改变;
当使用支持事务的存储引擎时,所有未提交的二进制日志会被记录到一个缓存中(当超过缓存大小时会记录到临时文件中),等待该事务提交时直接将缓存刷新到bin_log中
bin_log的记录格式有三种(记录执行SQL,记录更新数据,混合模式),在’记录执行SQL’的模式下主从复制不能使用RC模式
存储引擎文件
存储引擎文件主要有’表空间文件’,重做日志文件(redo log)
表空间文件
表空间文件指的是实际存储数据的文件,分为两种类型默认的表空间,这种表空间是共享数据存储的模式,另外一种是独自的表空间,为每一张表单独生产独立的表空间文件存放数据/索引/插入缓冲BITMAP,但是该表其余的数据还是放到默认的表空间中
重做日志文件
重做日志文件是innoDB用来保证数据完整性的关键,默认采用一个重做日志组下面有两个镜像重做日志文件的架构.
redo_log是在sql执行过程中不断的进行写入和复制,这里和bin_log有所差异,bin_log是在事务提交后进行的写入.
redo_log的记录对象是对每个页的更改的物理记录,redo_log记录的是向前的更新记录.
MySQL表结构
MySQL的文件结构是如何数据如何在物理上的结构,MySQL对于数据在逻辑上的结构可以划分为索引组织表,InnoDO的存储结构,行记录结构,页记录结构以及视图等
数据存储的方式
数据存储格式可以分为’堆表’/‘索引组织表’
- 堆表指的是数据的存放是无序的,是根据空闲磁盘空间来决定存放位置;
- 索引组织表指的是在存放数据时是按照主键索引来进行存放的.InnoDB的B+树索引结构就是一种索引组织表的形式.
InnoDB逻辑存储结构
InnoDB的逻辑存储结构划分为4级,分别是表空间-段空间-区空间-页空间,页空间上存储的就是一行一行的数据了
表空间
表空间是InnoDB逻辑存储上最上层的操作单位,一个表空间存储了所属该表的全部数据(data,index)
段空间
对表空间内的数据按照类型进行划分,又可以划分为数据段/索引段/回滚段等,这些不同的类型数据,被称为段空间
------逻辑-物理分割层------
区空间
区空间是由连续的磁盘空间组成,默认区空间大小为1MB,为了保证区空间的连续性还会一次向磁盘申请多个区空间.区空间实际存储了段空间内的数据.
页空间
页空间是InnoDB最小的磁盘管理单位,在InnoDB中每个页的大小为16KB,因此一个区可以存储64个页.页按照类型可以划分为
- 数据页
- undo页
- 系统页
- 事务数据页
- 插入缓冲页(BitMap/Free List)
- 二进制大对象页
行
InnoDB中的数据是按照行来进行存储的,行数据的记录格式按照类型可以分为两类.Compact和Redundant两种类型.
-
Redundant
Redundant类型是为了兼容之前版本而设计的 -
Compact
Compact格式是MySQL5.0中引入的,目的是高效的存储数据. -
数据结构
变长字段长度列表 | NULL标志位 | 记录头信息 | 列数据… | 事务ID | 回滚指针 |
---|
特别要注意’事务ID’和’回滚指针’这两项与隔离级别和事务回滚有关;
NULL,在行的数据结构中都不占用任何存储空间,因为在行的数据结构中有NULL标志位来处理NULL
- Varchar类型长度
Varchar类型在MySQL中的定义是最大能存储65535个字节,并且是该行所有的Varchar类型长度之和.由于一个页的大小为16KB,因此在Varchar的类型长度实际上是超过一页的大小,这样就会导致一页上不能存储一行数据.这里InnoDB采用了溢出页的方式来进行处理,page上只保留数据头信息,而溢出页上存储溢出的信息(溢出指的是数据大小溢出InnoDB设定的额定大小,而不是page页的大小)
InnoDB数据页结构
InnoDB的数据页结构指的是页空间中数据页的结构,主要由数据系统信息和用户记录信息组成
- 数据系统结构
数据系统结构主要是由文件头/页头/Infimun-Supremum Records/页目录等组成,标记了该块区域的系统信息 - Infimun-Supremum Records指的是一个小于数据主键的区间起始值和终止值.这两个值会在B+树中进行存储
- 页目录指的是指的是标记用户数据的相对位置的结构
在进行数据查找时,会先从B+树中查询到数据对应的页,将页加载到内存中后,根据页目录来对用户数据进行二分查找(重点)
约束
关系型数据库系统和文件系统的一个不同点是,关系型数据库本身能够保证存储数据的完整性,不需要应用程序的控制,而文件系统则需要应用程序来保证数据的完整性.当前所有的关系型数据库都提供了约束机制;
约束和索引的区别:
当用户创建了一个唯一索引时就创建了一个唯一的约束,但是约束和索引的概念是不同的,约束更像是一个逻辑上的概念,用来保证数据的完整性,而索引是一个数据结构,即代表逻辑上的概念,同时也是物理存储的方式;
- ENUM和SET就是一种约束