乐趣区

关于mysql:MySql-一条语句是怎么插入磁盘的

咱们晓得 mysql 插入语句后,都是寄存在磁盘文件的,如果是多条数据的话,也是紧凑的挨在一起,比方下图:

然而实际上又有点不一样,因为咱们建表的时候,有些字段的长度是可变的,比方咱们定义了 varcher(10),可能就存了 a,尽管能够通过补齐长度来实现每条数据的长度是一样的,但这样就节约了存储空间,所以多条数据可能是这样寄存的:

如果数据长度不一样的话,那 mysql 读取某一行的数据的时候,就很麻烦了,他不晓得从哪里开始从哪里完结,所以每一条数据就包含两个局部的内容,一个是形容这条数据的信息,一个是理论的数据。

形容数据有三个局部,别离是变长字段的长度列表、null 值列表、数据头。理论数据就是每个字段的值紧凑的挨在一起。所以实际上每行数据的构造是这样的:

变长字段的长度列表

咱们创立表的时候,就会指定字段的类型,比方 column1 是可变字段的,这个时候变长字段的长度列表会记录 column1 的长度,比方他的值是 abc,那长度就是 3,转十六进制的话就是 0x03,他的存储是这样的:

咱们读取数据的时候,就能够通过 0x03 晓得 column1 要取多少数据。
如果 column2 也是可变字段,比方他的值是 de,那他的存储是这样:

这里须要留神的是,他的程序跟字段的程序是相同的。

null 值列表

变长字段是用来晓得咱们每个字段理论的占用长度,那 null 值字段其实就是表明哪些值是 null 的。因为某个字段是 null 的话,他实际上并不会存磁盘的,防止空间的占用。是否为空就两种状态,是或则不是,所以这里有二进制来示意,1 示意 null,0 示意非 null。每一个容许 null 的字段对应一位,位数是 8 的倍数,不够就补零,所以咱们三个字段也是 0000 0000。跟变长字段的长度列表一样,他也是逆序的,即第一个字段在最初一位,所以咱们假如第一行的 column3 是 null,那 null 值列表就是 001,逆序就是 100,补齐 0 就是 0000 0100,那存储是这样的:

通过变长字段的长度列表咱们晓得字段应该读取的长度,通过 null 值列表咱们晓得哪些字段应该疏忽读的。

数据头

数据头有 40 位,后 16 位是 next_record,他次要是记录下一行的数据指针。

理论数据

咱们存到磁盘的时候,会通过肯定的字符集编码进行对数据进行编码,而后寄存。
除了咱们定义的表字段外,他还有其余的暗藏字段,比方 DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR。
DB_ROW_ID 是一行的惟一标识,如果没有指定主键,那他的值就是主键。
DB_TRX_ID 用于寄存事务的 ID。
DB_ROLL_PTR 用于事务回滚。
所以理论的存储如下(编码这里就略了):

退出移动版