计算机程序设计网站开发,十堰秦楚网 十堰新闻门户网站,做软件的人叫什么,黄骅港赶海推荐个好地方InnoDB页简介
InnoDB是一个将表中的数据存储到磁盘上的存储引擎#xff0c;所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的#xff0c;所以需要把磁盘中的数据加载到内存中#xff0c;如果是处理写入或修改请求的话#xff0c;还需要把内…InnoDB页简介
InnoDB是一个将表中的数据存储到磁盘上的存储引擎所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的所以需要把磁盘中的数据加载到内存中如果是处理写入或修改请求的话还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢和内存读写差了几个数量级所以当我们想从表中获取某些记录时InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么不那样会慢死InnoDB采取的方式是将数据划分为若干个页以页作为磁盘和内存之间交互的基本单位InnoDB中页的大小一般为 16 KB。也就是在一般情况下一次最少从磁盘中读取16KB的内容到内存中一次最少把内存中的16KB内容刷新到磁盘中。
InnoDB行格式
我们平时是以记录为单位来向表中插入数据的这些记录在磁盘上的存放方式也被称为行格式或者记录格式。设计InnoDB存储引擎的大佬们到现在为止设计了4种不同类型的行格式分别是Compact、Redundant、Dynamic和Compressed行格式随着时间的推移他们可能会设计出更多的行格式但是不管怎么变在原理上大体都是相同的。
Compact 行格式
mysql CREATE TABLE record_format_demo (- c1 VARCHAR(10),- c2 VARCHAR(10) NOT NULL,- c3 CHAR(10),- c4 VARCHAR(10)- ) CHARSETascii ROW_FORMATCOMPACT;
Query OK, 0 rows affected (0.03 sec)记录的额外信息
变长字段长度列表 在Compact行格式中把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位从而形成一个变长字段长度列表各变长字段数据占用的字节数按照列的顺序逆序存放。
NULL值列表 我们知道表中的某些列可能存储NULL值如果把这些NULL值都放到记录的真实数据中存储会很占地方所以Compact行格式把这些值为NULL的列统一管理起来存储到NULL值列表中它的处理过程是这样的 首先统计表中允许存储NULL的列有哪些。 我们前面说过主键列、被NOT NULL修饰的列都是不可以存储NULL值的所以在统计的时候不会把这些列算进去。比方说表record_format_demo的3个列c1、c3、c4都是允许存储NULL值的而c2列是被NOT NULL修饰不允许存储NULL值。 如果表中没有允许存储 NULL 的列则 NULL值列表 也不存在了否则将每个允许存储NULL的列对应一个二进制位二进制位按照列的顺序逆序排列二进制位表示的意义如下 二进制位的值为1时代表该列的值为NULL。二进制位的值为0时代表该列的值不为NULL。因为表record_format_demo有3个值允许为NULL的列所以这3个列和二进制位的对应关系就是这样
MySQL规定NULL值列表必须用整数个字节的位表示如果使用的二进制位个数不是整数个字节则在字节的高位补0。表record_format_demo只有3个值允许为NULL的列对应3个二进制位不足一个字节所以在字节的高位补0以此类推如果一个表中有9个允许为NULL那这个记录的NULL值列表部分就需要2个字节来表示了。
记录头信息 除了变长字段长度列表、NULL值列表之外还有一个用于描述记录的记录头信息它是由固定的5个字节组成。5个字节也就是40个二进制位不同的位代表不同的意思如图
记录的真实数据
对于record_format_demo表来说记录的真实数据除了c1、c2、c3、c4这几个我们自己定义的列的数据以外MySQL会为每个记录默认的添加一些列也称为隐藏列具体的列如下 这里需要提一下 InnoDB表对主键的生成策略优先使用用户自定义主键作为主键如果用户没有定义主键则选取一个不允许存储 NULL值的Unique键作为主键如果表中连不允许存储 NULL值Unique键都没有定义的话则InnoDB会为表默认添加一个名为row_id的隐藏列作为主键。所以我们从上表中可以看出InnoDB存储引擎会为每条记录都添加 transaction_id 和 roll_pointer 这两个列但是 row_id 是可选的在没有自定义主键以及Unique键的情况下才会添加该列。这些隐藏列的值不用我们操心InnoDB存储引擎会自己帮我们生成的。