深入理解MySQL_4 数据存储

1 innoDB数据存储:

表空间:innodb数据是存储在表空间(文件空间file space)内的,表空间是一个抽象的概念,他对应着硬盘上的一个或多个文件。表空间可以分为系统表空间、独立表空间、其他类型的表空间。

(1)系统表空间

  • 系统表空间包含了很多【公共数据】,比如InnoDB的数据字典,回滚信息、系统事物信息、二次写缓冲等,老版本的mysql表中的数据也会存储在系统表空间。
  • 系统表空间是一个共享的表空间因为它是被多个表共享的。
  • 该空间的数据文件通过参数【innodb_data_file_path】控制,默认值是ibdata1:12M:autoextend(文件名为ibdata1、12MB、自动扩展)。
  • 系统表空间也可以通过配置,修改文件的名称和个数。

(2) 独立表空间

· 独立表空间是默认开启的,在5.6.6以后,innoDB不再默认将各个表的数据存储在【系统表空间】当中,而是会为每一个表建立一个【独立表空间】,innodb存储引擎的独立表空间为【.ibd】文件。

  • 如果启用了【innodb_file_per_table】参数,需要注意的是每张表的表空间内存放的只是【数据】、【索引】和【插入缓冲Bitmap页】,其他数据如:回滚信息、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的系统表空间内。
  • 即使启用了【innodb_file_per_table】参数,系统表空间还是会不断的增加其大小的。

innodb还提供了很多其他类型的表空间,比如通用表空间,undolog表空间、临时表空间等

页:表空间存储数据的单位是【页】,一个表空间就是个大大的本子,本子里是一页页的数据(innodb是以页为单位进行数据存储的),常用页面类型有很多,不同类型的页面可以存放【不同类型的数据】

file header:记录页面的一些通用信息,比如当前页的校验和、页号、上页号、下页号、所属表空间等。

file trailer:主要的工作是检验页是否完整。

页号:表空间中的每一个页,都有一个页号(File_PAGE_OFFSET),我们可以通过这个页号在表空间快速定位到指定的页面。整体的排列中页是连续的,但是页有上下指针,不连续的页也能组成链表。

2 MyISAM数据存储

MyISAM没有表空间的概念,他会在目录中产生2个文件【.MYD】(数据文件)、【 .MYI】(索引文件)。

3 innoDB组织结构:

  • 区(extent):每一个表空间保存了大量的页,为了更好的管理这些页面,Innodb提出了【区】的概念,对于16k的页,连续64个页就是一个区,大概1M的空间,每一个表空间都是由若干个连续的区组成的,每256个区被划分为一组。
  • 段(Segment):分为索引段,数据段,回滚段等,段是为了区分不同的数据类型,相同的段存的数据类型是一致的。一个段包含256个区(256M大小)。

4 行记录格式ROW_FORMAT

一个表的【行记录格式】决定表中行的【物理存储模式】,决定了【DQL】和【DML】的操作性能。越多的行被匹配进独立的磁盘页,sql的性能会更好一些,需要的缓存及io操作就越少。一条完整的信息记录分为:【记录的额外信息】和【记录的真实数据】两大部分。可以通过命令SHOW TABLE STATUS LIKE 'table_name'来查看当前表使用的行格式,其中row_format就代表了当前使用的行记录结构类型。行记录格式分为:COMPACT、REDUNDANT、DYNAMIC、COMPRESSED。

(1)COMPACT

【COMPACT行记录】是在MySQL 5.0时被引入的,其设计目标是能高效存放数据。COMPACT行记录以如下方式进行存储:

非NULL【变长字段长度列表】+【NULL标志位】+【记录头信息】+【实际存储的每个列的数据】+【隐藏列事务ID列和回滚指针列】

非NULL【变长字段长度列表】:变长列的真实长度就保存在这个部分,他是按照列的顺序【逆序放置】的。当列的长度小于255字节,用1字节表示;若大于255个字节,用2个字节表示,这其实也就说明了为什么varchar的最大长度是65536

【NULL标志位】:指示了当前行数据中哪些为null值,用一个bitmap表示

【记录头信息】:固定占用5个字节(40位),包括:该行是否已被删除、该记录拥有的记录书、页中下一条记录的相对位置等

【实际存储的每个列的数据】:NULL不占该部分任何数据,即NULL除了占有NULL标志位,实际存储不占有任何空间。

【隐藏列事务ID列和回滚指针列】:每行数据除了用户定义的列外,还有两个隐藏列,事务ID列和回滚指针列,分别为6个字节和7个字节的大小。

(2)REDUNDANT

【REDUNDANT行记录】是MySQL 5.0版本之前InnoDB的行记录存储方式。REDUNDANT行记录以如下方式存储:

【字段长度偏移列表】+【记录头信息】+【实际存储的每列数据】

【字段长度偏移列表】:保存了该行数据所有列,包括隐藏列的长度偏移量。举一个例子说明一下偏移,假如第一个字段长度为x,第二个字段长度为y,那么列表中第一个字段就是x,第二个字段就是x+y。这个偏移列表是按照列的顺序【逆序排列】。

【记录头信息】:REDUNDANT行格式固定占用6个字节(48位),包括:该行是否已被删除、该记录拥有的记录书、页中下一条记录的相对位置等

【实际存储的每列数据】:就是实际存储的每列数据

null值的存储,在【字段长度偏移列表】的每个字段长度最高位标记 1 表示这个字段为 NULL。

COMPACT和REDUNDANT的区别:

compact格式比redundant存储空间大约减少20%。如果受限于cache命中和磁盘速度,compact格式会快一些,若受限于CPU速度,compact格式会慢一些。

(3) DYNAMIC

MySQL8.0的默认行格式,InnoDB引入了两种新的文件格式(file format,可以理解为新的页格式),对于以前支持的Compact和Redundant格式将其称为Antelope文件格式,新的文件格式称为Barracuda。Barracuda文件格式下拥有两种新的行记录格式Compressed和Dynamic两种。

新的两种格式对于存放BLOB的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际的数据都存放在BLOB Page中

(4) COMPRESSED

基于DYNAMIC格式,支持表和索引数据压缩。COMPRESSED行格式采用DYNAMIC相同的页外存储细节,同时,存储在其中的行数据会以zlib的算法进行压缩,因此对于BLOB、TEXT、VARCHAR这类大长度类型的数据能进行非常有效的存储。

相关推荐
STER labo18 分钟前
mysql配置环境变量——(‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法)
数据库·mysql·adb
dreamZhanglx38 分钟前
MySQL进阶
数据库·mysql
xmjd msup39 分钟前
MySQL 函数
数据库·mysql
jefl jxak2 小时前
mysql用户名怎么看
数据库·mysql
unDl IONA2 小时前
mysql之如何获知版本
数据库·mysql
俺不要写代码2 小时前
数据库:约束
数据库·mysql
WL_Aurora3 小时前
MySQL 5 卸载到 MySQL 8 安装完整指南(不踩坑版)
数据库·mysql
灰阳阳3 小时前
MySQL的基本架构
数据库·mysql·架构
@小柯555m3 小时前
MySql(高级操作符--Where in 和Not in)
数据库·sql·mysql
MmeD UCIZ3 小时前
MySQL单表存多大的数据量比较合适
数据库·mysql