MySQL InnoDB存储引擎之表(二)

本篇是继续上一篇未完的部分继续说的。

4.InnoDB数据页结构

页是InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-tree Node的页存放的就是表中行的实际数据。页由以下七个部分组成:File Header(文件头)、Page Header(页头)、Infimun和Supremum Records、User Records(行记录)、Free Space(空闲空间)、Page Directory(页目录)和File Trailer(文件尾)。  如下图:

其中File Header、Page Header和File Trailer的大小是固定的,分别为38、56、8字节,用来标记该页的一些信息,如checksum,数据页所在B+树索引的层数等。User Records、Free Space和Page Directory这些部分为实际的行记录存储空间,因此大小是动态的。下边分别介绍一下各部分

A.File Header

File Header用来记录一些页的头信息,由8个部分组成,共占用38字节。如下图:

其中FIL_PAGE_TYPE的具体类型如下图:

B.Page Header

Page Header用来记录数据页的一些状态信息,由14个部分组成,共占用56字节。如下图:

C.Infimun和Supremum

在InnoDB存储引擎中,每个数据页都有两个虚拟的行记录,用来限定记录的边界。Infimun记录是比该页中任何主键都要小的值,Supremum指比任何可能大的值还要大。都是在页创建时被建立,并且在任何情况下都不会被删除。在Compact和Redundant行格式下,占用的字节数不想同。如下图:

D.User Record和Free Space

User Record就是实际存储行记录的内容。Free Space指空闲空间,同样也是一个链表数据结构,在一条数据被删除后,该空间会加入到空闲链表中。

E.Page Directory

Page Directory中存放了记录的相对位置(是页相对位置而不是偏移量),有些时候这些记录指针称为Slots(槽)或者Directory Slots(目录槽)。在InnoDB存储引擎的槽是一个稀疏目录(spare directory),即一个槽中可能包含多个记录。伪记录Infimum的n_owned值总是1,记录Supremum的n_owned的取值范围为[1,8],其他用户记录n_owned的取值范围[4,8]。当记录被插入或者删除时需要对槽进行分裂或平衡的维护操作。在Slots中记录是按照索引键值进行存放的,这个样子可以利用二叉查找迅速找到记录的指针。由于InnoDB存储引擎中Page
Directory是稀疏目录,二叉查找的结果是一个粗略的结果,因此InnoDB存储引擎必须通过record header中的next_record来继续查找相关记录。B+树索引本身并不能找到具体的一条记录,能找到只是该记录所在的页。数据库把页载入到内存中,然后通过Page Directory在进行二叉查找。二叉查找的时间复杂度很低,同时在内存中的查找很快,因此通常忽略这部分查找所用的时间。

F.File Trailer

为了检查页是否已经完整的写入磁盘(如可能发生的写入过程中磁盘损坏、机器关机等),InnoDB存储引擎的页设置了File Trailer部分。File Trailer只有一个FIL_PAGE_END_LSN部分,占用8字节。前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN相同。将这两个值与File Header中的FIL_PAGE_SPACE_OR_CHECKSUM和FIL_PAGE_LSN值进行比较,看是否一致(checksum的比较需要通过InnoDB的checksum函数来进行比较,不是简单的等值比较),以此来保证页的完整性。

在默认配置下,InnoDB存储引擎每次从磁盘读取一个页就会检测该页的完整性,即页是否发生Corrupt。用户可以通过参数innodb_checksums来开启或者关闭这个页完整性的检查。MySQL 5.6.6版本开始新增参数innodb_checksum_algorithm来设置checksum函数的算法。默认为crc32,可以设置的值有:innodb、crc32、none、strict_innodb、strict_crc32、strict_none.

5.Named File Formats机制

随着InnoDB存储引擎的发展,新的页数据结构有时用来支撑新的功能特性。如InnoDB 1.0.X版本提供了新的页数据结构来支持表压缩功能,完全的溢出(Off page)大变长字符类型字段的存储。这些新的页数据结构和之前版本的页并不兼容,因此InnoDB存储引擎通过Named File Formats机制来解决不同版本之间的兼容性。通过参数innodb_file_format设置文件格式。通过参数innodb_file_format_check来检测当前InnoDB存储引擎文件格式的支持度,默认为ON。

6.视图

视图(view)是一个命名的虚表,由一个SQL查询来定义,可以当做表使用,与持久表不同的是,视图中的数据没有实际的物理存储。在实际的开发中几乎都没有用过,忽略了~~

7.分区表

分区的过程是将一个表或者索引分解为多个更小、更可管理的部分。目前MySQL数据库只支持水平分区,并不支持垂直分区。在实际的开发中几乎都没有用过,忽略了~~

时间: 2024-08-03 07:07:25

MySQL InnoDB存储引擎之表(二)的相关文章

MySQL InnoDB存储引擎之表(一)

主要介绍InnoDB存储引擎表的逻辑存储以及实现.重点介绍数据在表中是如何组织和存放的. 1.索引组织表(index organized table) 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表叫索引组织表.在InnoDB存在引擎表中,每张表都有个主键(Primary key),如果在创建表时没有显示定义主键,则会按照如下方式选择或者创建主键:a.判定是否有非空的唯一索引(unique not null),如果有则该列即为主键.若果有多个,则选择建表是第一个定义的非

mysql innodb存储引擎的聚集索引

InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索引,即MySQL不会一次把数据行保存在二个地方.InnoDB通常根据主键值(primary key)进行聚集,但是当一个表没有PK怎么办?InnoDB选取聚集索引参照列的顺序是: 1.如果声明了主键(primary key),则这个列会被做为聚集索引2.如果没有声明主键,则会用一个唯一且不为空的索引

InnoDB存储引擎的表空间文件,重做日志文件

存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据.这些存储引擎真正存储了数据和索引等数据. 表空间文件 InnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放.默认配置下,会有一个初始化大小为10MB.名为ibdata1的文件.该文件就是默认的表空间文件(tablespace file).你可以通过参数innodb_data_file_path对其进行设置.格式如下: innodb_data_file_path=datafile_

MySQL Innodb 存储引擎学习篇

master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspend loop).master thread 会根据数-据库运行的状态在loop,background loop.flush loop 和suspend loop 中进行切换.                每秒一次的操作:        1.日志缓冲刷新到磁盘,即使这个事务还没有提交(总是).   

MySQL InnoDB 存储引擎原理浅析

注:本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍<MySQL技术内幕++InnoDB存储引擎>,本文章仅记录个人认为比较重要的部分,有兴趣的可以花点时间读原书. 一.MySQL体系结构 主要包含以下几部分: 1.管理服务于工具组件. 2.连接池与鉴权. 3.SQL接口. 4.查询分析器. 5.优化器组件. 6.缓存与缓冲区. 7.各式的插件式存储引擎. 8.物理文件. 其中存储引擎是基于表,而非数据库. 二.InnoDB体系结构 InnoDB引擎包含几个重要部分: 1.后台进程

MySQL InnoDB存储引擎排它锁和共享锁的研究

1,共享锁实验 session1 在session1建表lisa并插入数据 mysql> create table lisa(name char(10),age int(5)); mysql> insert into lisa values('lisa','26'); 加给age=26这一行加共享锁 mysql> set autocommit=0; mysql> select * from lisa where age=26 lock in share mode; mysql>

MySQL InnoDB存储引擎

MySQL对应InnoDB版本 MySQL 5.1>InnoDB 1.0.X MySQL 5.5>InnoDB 1.1.X MySQL 5.6>InnoDB 1.2.X 后台线程 1.Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性:包括刷新脏页.合并插入缓冲.undo页的回收. 2.IO Thread innodb存储引擎中大量使用了AIO(Async IO)来处理写IO请求来提高数据库的并发性能,共有四类IO线程,分别是:insert buffer t

MySQL InnoDB存储引擎之锁

概念: 锁是用来管理对共享文件的并发访问.innodb会在行级别上对数据库上锁.不过innodb存储引擎会在数据库内部其他多个地方使用锁,从而允许对不同资源提供并发访问.例如操作缓冲池中的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入.MyISAM引擎是表锁,而InnoDB提供一致性的非锁定读.行级锁,且行级锁没有相关额外的开销. 锁 table-level locking(表级锁) 整个表被客户锁定.根据锁定的类型,其他客户不能向表中插入记录,甚至从中读数据也受

mysql innodb存储引擎介绍

innodb存储引擎1.存储:数据目录.可以通过配置修改 存储文件:frm,ibd结尾的文件.frm存储表结构,ibd存储索引和数据 存储日志:ib_logfilen文件 2.innodb存储引擎开启或关闭: 关闭innodb_fast_shutdown= 0 完成所有的full purge和merge insert buffer操作(如:做InnoDB plugin升级时) 1 默认,不需要完成上述操作,但会刷新缓冲池中的脏页 2 不完成上述两个操作,而是将日志写入日志文件,下次启动时,会执行