深入理解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这类大长度类型的数据能进行非常有效的存储。

相关推荐
u***27611 小时前
【MySQL】数据库和表的操作
数据库·mysql·oracle
g***55751 小时前
【MySQL基础篇】概述及SQL指令:DDL及DML
sql·mysql·oracle
r***01381 小时前
Java进阶,时间与日期,包装类,正则表达式
java·mysql·正则表达式
言之。1 小时前
Django MySQL 事务机制与回滚行为说明
数据库·mysql·django
last demo1 小时前
Linux 正则表达式
linux·mysql·正则表达式
2***c4351 小时前
MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
数据库·mysql
e***19352 小时前
MySQL-触发器(TRIGGER)
android·数据库·mysql
Aiden121212 小时前
Mysql主从复制与读写分离
数据库·mysql
j***12152 小时前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql