Myisam-存储引擎-静态格式-DELETED ROWS

在上一节的介绍中,我们对DELETED ROWS留下了疑问:
疑问1: 行被删除后,该行有6个字节被重置了,在这里为什么只置6个字节? 为什么需要置这6个字节,光有header不能识别吗?

带着疑问,进入我们这一章节.[@more@]
--MYISAM 静态格式数据存储结构-DELETED ROWS
1. 介绍

在上一节的介绍中,我们对DELETED ROWS留下了疑问:
疑问1: 行被删除后,该行有6个字节被重置了,在这里为什么只置6个字节? 为什么需要置这6个字节,光有header不能识别吗?

带着疑问,进入我们这一章节.

2. 深入研究静态格式中被删除的行
2.1 搭建环境
2.1.1 系统,DB

OS : Linux 2.6.9-42.ELsmp
DB : MYSQL 5.0.51a
ENGIRE: MYISAM DEFAULT CHARSET=latin1
2.1.2 建立测试数据
use test;
drop table if exists heyf ;
create table heyf (id int , name char(8)) type myisam DEFAULT CHARSET=latin1;
insert into heyf values (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'),(5,'eee') ;
system hexdump /opt/mysql/data/test/heyf.MYD;
-------------------------------------------------
0000000 01f9 0000 6100 6161 2020 2020 f920 0002
0000010 0000 6262 2062 2020 2020 03f9 0000 6300
0000020 6363 2020 2020 f920 0004 0000 6464 2064
0000030 2020 2020 05f9 0000 6500 6565 2020 2020
0000040 0020
-------------------------------------------------
2.2 开始分析
把上面的行分解一下:
-------------------------------------------------
ROW1: f9 01 00 00 00 61 61 61 20 20 20 20 20
ROW2: f9 02 00 00 00 62 62 62 20 20 20 20 20
ROW3: f9 03 00 00 00 63 63 63 20 20 20 20 20
ROW4: f9 04 00 00 00 64 64 64 20 20 20 20 20
ROW5: f9 05 00 00 00 65 65 65 20 20 20 20 20
-------------------------------------------------
2.2.1 我们来删除第3行数据:
delete from heyf where id=3 ;
system hexdump /opt/mysql/data/test/heyf.MYD;
-------------------------------------------------
0000000 01f9 0000 6100 6161 2020 2020 f920 0002
0000010 0000 6262 2062 2020 2020 ff00 ffff ffff
0000020 63ff 2020 2020 f920 0004 0000 6464 2064
0000030 2020 2020 05f9 0000 6500 6565 2020 2020
0000040 0020
-------------------------------------------------
我们看到ROW3变成了:
-------------------------------------------------
ROW3: 00 ff ff ff ff ff ff 63 20 20 20 20 20
-------------------------------------------------

2.2.2 我们来再删除第4行数据:
delete from heyf where id=4 ;
system hexdump /opt/mysql/data/test/heyf.MYD;
-------------------------------------------------
0000000 01f9 0000 6100 6161 2020 2020 f920 0002
0000010 0000 6262 2062 2020 2020 ff00 ffff ffff
0000020 63ff 2020 2020 0020 0000 0000 0200 2064
0000030 2020 2020 05f9 0000 6500 6565 2020 2020
0000040 0020
-------------------------------------------------
我们看到ROW3,ROW4变成了:
-------------------------------------------------
ROW3: 00 ff ff ff ff ff ff 63 20 20 20 20 20
ROW4: 00 00 00 00 00 00 02 64 20 20 20 20 20
-------------------------------------------------

2.2.3 我们来再删除第5行数据:
delete from heyf where id=5 ;
system hexdump /opt/mysql/data/test/heyf.MYD;
-------------------------------------------------
0000000 01f9 0000 6100 6161 2020 2020 f920 0002
0000010 0000 6262 2062 2020 2020 ff00 ffff ffff
0000020 63ff 2020 2020 0020 0000 0000 0200 2064
0000030 2020 2020 0000 0000 0000 6503 2020 2020
0000040 0020
-------------------------------------------------
我们看到ROW3,ROW4,ROW5变成了:
-------------------------------------------------
ROW3: 00 ff ff ff ff ff ff 63 20 20 20 20 20
ROW4: 00 00 00 00 00 00 02 64 20 20 20 20 20
ROW5: 00 00 00 00 00 00 03 65 20 20 20 20 20
-------------------------------------------------

2.2.4 我们来再删除第1行数据:
delete from heyf where id=1 ;
system hexdump /opt/mysql/data/test/heyf.MYD;
-------------------------------------------------
0000000 0000 0000 0000 6104 2020 2020 f920 0002
0000010 0000 6262 2062 2020 2020 ff00 ffff ffff
0000020 63ff 2020 2020 0020 0000 0000 0200 2064
0000030 2020 2020 0000 0000 0000 6503 2020 2020
0000040 0020
-------------------------------------------------
我们看到ROW1,ROW3,ROW4,ROW5变成了:
-------------------------------------------------
ROW1: 00 00 00 00 00 00 04 61 20 20 20 20 20
ROW3: 00 ff ff ff ff ff ff 63 20 20 20 20 20
ROW4: 00 00 00 00 00 00 02 64 20 20 20 20 20
ROW5: 00 00 00 00 00 00 03 65 20 20 20 20 20
-------------------------------------------------

2.3 小结

到了这里,我们基本上能看明白MYISAM在DELETE的时候干了什么.
在这里小结一下:
MYISAM在删除行的时候:
1)将该行的第1个字节置为"00"
2)将该行的第2~7个字节置为上一个被删除行的"行序列号",
(MYSQL静态格式中,每一个行都会有一个编号,从000000开始编号)
如果是第一条被删除的行,那么这6位会被置为"FF FF FF FF FF FF".
大家可以试着看一下上面的数据

也许你在这里会问:
"行序列号" 需要6个字节,那么如果每行长度(标志位除外)<6B的时候,MYISAM如何来存储的呢?
为此也进一步做了一个测试,我们会发现,当我们的行长度<6B的时候,MYISAM一律按每行6B进行分配空间.
来看测试:
use test;
drop table if exists heyf ;
create table heyf (id TINYINT , name char(2)) type myisam DEFAULT CHARSET=latin1;
insert into heyf values (1,'aa'),(2,'bb'),(3,'cc'),(4,'dd'),(5,'ee') ;
system hexdump /opt/mysql/data/test/heyf.MYD;
------------------------------------------------
0000000 01f9 6161 0000 f900 6202 0062 0000 03f9
0000010 6363 0000 f900 6404 0064 0000 05f9 6565
0000020 0000 0000
-------------------------------------------------
读出数据:
------------------------------
ROW1: f9 01 61 61 00 00 00
ROW2: f9 02 62 62 00 00 00
... ...
------------------------------
我们看到,每行分配1B(FLAG)+6B(DATA). 没有数据的部分填上00.
这样做完全是为了满足DELETE的标志位

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/703656/viewspace-1019042/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/703656/viewspace-1019042/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值