InnoDB存储引擎4(表)
Posted SmartCat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了InnoDB存储引擎4(表)相关的知识,希望对你有一定的参考价值。
本章将从InnoDB存储引擎表的逻辑存储及实验开始进行介绍,然后将重点分析表的物理存储特征,即数据在表中是如何组织和存放的。简单的来说,表就是关于特定实体的数据集合,这也是关系型数据库的核心。
4.1索引组织表
在创建表时没有显式地定义主键,会按照如下进行创建主键:
1.首先判断表中是否有非空的索引的唯一索引。如果有,则该列为主键
2.如果不符合以上条件就会,自动创建一个6字节大小的指针
3.如果存在多个非空唯一索引(UNIQUE KEY(X)),就会根据定义的第一个索引为主键
4.2InnoDB逻辑存储结构
所有带数据都被逻辑的存放在一个空间里,称为表空间,表空间:表空间--->段--->区--->块--->行
![](https://image.cha138.com/20210515/f2447646cba146eba154e60ed4473f68.jpg)
表空间可以看做是InnoDB中最高层,所有的数据都存放在表空间中。默认情况下InnoDB有一个共享表空间ibdatal,所有数据都存放在这个表空间里面,如果开启了参数innode_file_per_table这个参数就会将数据存放在单独的一个空间里面。
表空间是由各个段组成的,常见的段有数据段(索引),索引段,回滚段等,InnoDB存储引擎是由索引组织的,因此数据就是索引,对段的管理都是由InnoDB自己完成的
区是由连续页组成的空间,在任何情况下每一个区的大小都为1MB,为了保证区中页的连续性,InnoDB存储引擎一次从磁盘中申请4~5个区,一个区中默认有64个16KB的连续页。每个页的大小可以进行压缩,但是总数为1MB是不变的。
如果是开启了innode_file_per_table参数就会先使用碎片页。
页是InnoDB中最小的单位,常见的页有以下:
![](https://image.cha138.com/20210515/800a465809134f27b050f398498ee2b1.jpg)
行:数据是按照行进行存放的,默认最多放到7992条记录,InnoDB提供了两种记录行的方法:Compact和Redundant。其中Compact
![](https://image.cha138.com/20210515/7f45c192200a470d963dab73af5f4eb8.jpg)
compace行记录格式的首部是一个非NULL变长字段长度列表,而且是按照列的顺序逆序放置的。若列的长度小于255字节,用1字节表示。如果大于255就用2字节表示(因为VARCHAR的最大长度限制为65535)。
NULL标志位是为了指示是否有NULL值,如果有则为1.
记录头信息:固定占用5字节(40位):
![](https://image.cha138.com/20210515/d59adcd6f6e84da4aa5126aeb4a7cd35.jpg)
最后的部分就是实际存储每一行中列的数据,NULL不占任何空间。
按照书上的分析一段:
![](https://image.cha138.com/20210515/3b19d14fadd948a09eb55e6bb7a9d251.jpg)
![](https://image.cha138.com/20210515/755322d5db114d6db9cd796559cd6cc5.jpg)
从0000c078开始看
![](https://image.cha138.com/20210515/61121ea9169f4968b489e0a0def9730e.jpg)
可以看出03 02 01是逆序的 03 02 01代表的是63 62 61
固定长度Char没有沾满的时候会使用0x20来进行填充
0x2c表示下一个记录的偏移量,是使用链表的结构来串联各个行记录的
![](https://image.cha138.com/20210515/427478be39bc4825b753d383d3432973.jpg)
4.4数据页结构
页类型为B-tree-Node的页存放的就是表中行的实际数据了。
![](https://image.cha138.com/20210515/8120f5b6ab6b496faa04a628d840068e.jpg)
![](https://image.cha138.com/20210515/ef6a9258bd6e4ad5a1cbec2303b3bb95.jpg)
文件头记录了有关页的信息
![](https://image.cha138.com/20210515/69eb30227f8d45c3bfa8f2ef29278921.jpg)
而页头记录了大部分数据的信息
File Header 字段用于记录 Page 的头信息,其中比较重要的是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段,通过这两个字段,我们可以找到该页的上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表。Page Header 字段用于记录 Page 的状态信息。接下来的 Infimum 和 Supremum 是两个伪行记录,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键值都要大的值,这个伪记录分别构成了页中记录的边界。
![](https://image.cha138.com/20210515/0c847b811a7749e5a7a432efe5b523b8.jpg)
页头里面包含了大部分的页信息。
以上是关于InnoDB存储引擎4(表)的主要内容,如果未能解决你的问题,请参考以下文章