技术开发 频道

MYISAM 动态格式数据存储结构

  1.4 行链接的情况分析

  从上面看, 在行初始化时,系统给VARCHAR字段预留了14个字节的空间.

  如果我们的字段值在14个字符范围内,就不会溢出. 下面我们来看一下溢出(就是需要行链接)的情况:

  update heyf_5 set name='bbbbbaaaaabbbbbaaaaa' where name is null;

  update heyf_5 set name='cccccdddddcccccdddddzzzzzee' where name='c';

  system hexdump /opt/mysql/data/test/heyf_5.MYD

  ---------------------------------------------

  0000000 0003 0808 06fe 6161 6161 6161 0000 0000

  0000010 0000 0000 0005 0016 0007 0000 0000 0000

  0000020 fe3c 6214 6262 6262 0005 001b 0007 0000

  0000030 0000 0000 fe50 6319 6363 6363 0009 010f

  0000040 6161 6161 6261 6262 6262 6161 6161 0061

  0000050 0009 0216 6464 6464 6364 6363 6363 6464

  0000060 6464 7a64 7a7a 7a7a 6565 0000

  我们上面更新的是第二行和第三行的数据:

  ROW2: 0005 0016 0007 0000 0000 0000 fe3c 6214 6262 6262

  ROW3: 0005 001d 0007 0000 0000 0000 fe50 631b 6363 6363

  同时我们看到,在地址3C后面有其它数据:

  0000030 0009 010f

  0000040 6161 6161 6261 6262 6262 6161 6161 0061

  0000050 0009 010f 6464 6464 6364 6363 6363 6464

  0000060 6464 0064

  这个我们回头来分析:

  我们先把行的数据转一下:

  ROW2:05 00 16 00 07 00 00 00 00 00 00 00 3c fe 14 62 62 62 62 62

  ROW3:05 00 1d 00 07 00 00 00 00 00 00 00 50 fe 1b 63 63 63 63 63

  ROW2数据,其中:

  --------------------------------------------------------

  05 : 只要发生行链接type就会变成05

  00 16 : 实际字符长度 = 20+2= 22

  00 : 未使用的空间: 0 B

  07 00 00 00 00 00 00 00 3c :

  在这间多出了这么5个字节的地址,这个地址其实就是该行数据的链接地址

  ROW2为3C, ROW3为50

  fe : flags (0 表示不为null,1表示为null)

  14 : 该行中该字段实际数据的长度:20

  5个62/63 : 实际存储的值: 'bbbbb'/'ccccc'

  ---------------------------------------------------------

  在这里我们看到ROW2的数据只有'bbbbb',那么其他数据在哪里呢?

  MYSQL会根据类型知道需要链接,而链接地址正是:07 00 00 00 00 00 00 00 3c

  我们从3C开始读链接块数据:

  0009 010f 6161 6161 6261 6262 6262 6161 6161 0061

  转换一下:

  09 00 0f 01 61 61 61 61 61 62 62 62 62 62 61 61 61 61 61 00

  其中:

  --------------------------------------------------------

  09 : 还是类型: 代表这是链接数据

  00 0f : 该段实际字符长度 = 15

  01 : 空闲的空间字符数

  61 61 61 61 61 62 62 62 62 62 61 61 61 61 61 : 具体的值

  00 : 空闲的空间

  ---------------------------------------------------------

  同理我们来看看ROW3的链接数据: (从50开始)

  0009 0216 6464 6464 6364 6363 6363 6464 6464 7a64 7a7a 7a7a 6565 0000

  转换一下:

  09 00 16 02 'dddddcccccdddddzzzzzee' 00 00

  其中:

  --------------------------------------------------------

  09 : 还是类型: 代表这是链接数据

  00 16 : 该段实际字符长度 = 22

  02 : 未使用的空间: 2 B

  ... : 是具体的值和00

0
相关文章