Francis-xsc / atguigu_shk_mysql_pdf

5 stars 2 forks source link

第7章 3.2.2 老师讲解内容的一个问题 #1

Open xqzp486 opened 3 months ago

xqzp486 commented 3 months ago

0000c070 73 75 70 72 65 6d 75 6d 03 02 01 00 00 00 10 00|supremum........| 0000c080 2c 00 00 00 2b 68 00 00 00 00 00 06 05 80 00 00|,...+h..........| 0000c090 00 32 01 10 61 62 62 62 62 20 20 20 20 20 20 20|.2..abbbb| 0000c0a0 20 63 63 63 03 02 01 00 00 00 18 00 2b 00 00 00|ccc........+...| 0000c0b0 2b 68 01 00 00 00 00 06 06 80 00 00 00 32 01 10|+h...........2..| 0000c0c0 64 65 65 65 65 20 20 20 20 20 20 20 20 66 66 66|deeeefff| 0000c0d0 03 01 06 00 00 20 ff 98 00 00 00 2b 68 02 00 00|..........+h...| 0000c0e0 00 00 06 07 80 00 00 00 32 01 10 64 66 66 66 00|........2..dfff.|

老师的笔记 接着再来分析下Record Header的最后两个字节,这两个字节代表next_recorder,0x2c代表下一个记录的偏移量,即当前记录的位置加上偏移量0x2c就是下条记录的起始位置。

这个是有问题的,准确的来说 next_record 并不指向下一条记录的开头,他指向的是下一条记录的next_record

第一条记录的 next_record 是00 2C,即44个字节,第一条记录的next_record末尾 加44个字节是第二条记录 next_record的末尾 第二条记录的 next_record 是 00 2B ,即43个字节,第二条记录的next_record末尾 加43个字节是第二条记录 next_record的末尾

第三条记录的 next_record 是 ff 98 ,是一个负数,负的104个字节,43+44+17=104 为什么是负的104个字节,因为第三条记录是槽内最后一条记录,他逻辑上指向最大记录,物理上最大记录,在第一条记录上面,距离第一条记录的 next_record 有17个字节。

第一条数据分析('a','bb','bb','ccc')

十六进制码 解释
73 75 70 72 65 6d 75 6d supremum最大记录结尾
03 02 01 变长字段长度列表,逆序
col4的值为ccc,长度为3,col2的值为bb,长度为2,
col1的值为a,长度为1
00 NULL标志位,第一条没有NULL值
00 00 10 Record Header,固定5字节长度
预留位1和2、delete_mask、mini_rec_mask都是0,占4位0
n_owned 占4位 0
0010
heap_no 占十三位,由于是第2条记录,0和1是最小最大记录,所以二进制 0000 0000 0001 0
record_type 占三位,普通记录,所以二进制 000
00 2C next_record,指向下一条记录next_record字段的末尾
本条记录的next_record字段末尾距离
下一条记录的next_record末尾相差44个字节
所以本条记录的next_reocrd是44个字节,16进制2C
00 00 00 2b 68 00 RowID InnoDB自动创建,6字节
00 00 00 00 06 05 TransactionID
80 00 00 00 32 01 10 Roll Pointer
61 列1数据'a'
62 62 列2数据'bb'
62 62 20 20 20 20 20 20 20 20 列3数据'bb',由于类型是char(10),20代表空格,填充8个空格
63 63 63 列4数据'ccc'

分析有NULL值的第三条数据('d',NULL,NULL,'fff')

---------------------------------------------------------------------
03 01                       /*变长字段长度列表,逆序*/
06                          /*NULL标志位,第三行有NULL值*/
00 00 20 ff 98              /*Record Header*/
00 00 00 2b 68 02           /*RowID*/
00 00 00 00 06 07           /*TransactionID*/
80 00 00 00 32 01 10        /*Roll Pointer*/
64                          /*列1数据'd'*/
66 66 66                    /*列4数据'fff'*/
---------------------------------------------------------------------
Francis-xsc commented 2 months ago

已修改