分享数字类型的存储---抛砖引玉

zuoxingyu 2011-10-12 03:10:00
加精
下面数据仅测试数字类型的存储
我也不知道这样的测试方法是否本身就有问题,希望知情者赐教。


int数据是如何存储的?
Myisam引擎,5.1.59-community-log版本

1:测试最简单的INT,单个字段
mysql> create table test (id int);
Query OK, 0 rows affected (0.01 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 0 Oct 11 23:29 test.MYD
mysql> insert into test values(2);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 7 Oct 11 23:30 test.MYD
mysql>
#插入一条记录,占用了7个字节。
#用UltraEdit打开这个文件查看,内容如下:
FD 02 00 00 00 00 00 #16进制显示的,第二个字节存储的是数据。
猜的(第一位FD是记录开始标志位,2-5位是数据位,6-7是记录结束标志)
如果只有一个INT字段,那么一条记录就比标准的4字节,多出了3个字节。

再测试2个字段的
mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test (id int,a tinyint);
Query OK, 0 rows affected (0.03 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 0 Oct 11 23:37 test.MYD
mysql> insert into test values(4,5);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 7 Oct 11 23:37 test.MYD
mysql>

2个字节,一条记录,也是占用7个字节
#用UltraEdit打开这个文件查看,内容如下:
F9 04 00 00 00 05 00
猜的(第1位变成F9了,第2-5位是第一个字段的数据位,第6位是第2个字段的数据位,第7位是记录结束位)

再测试3个字段的
mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test (id int,a tinyint,b bigint);
Query OK, 0 rows affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 0 Oct 11 23:42 test.MYD
mysql> insert into test values(4,5,6);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 14 Oct 11 23:42 test.MYD
mysql>
#用UltraEdit打开这个文件查看,内容如下:
F1 04 00 00 00 05 06 00 00 00 00 00 00 00
猜的(第1位F1,2-5是第一个字段的数据位,第6位是第二个字段的数据位,第7-14位是第三个字段的数据位。记录开始位变了,没有结束位了)
3个字段的数据存储大小符合规则。1+4+1+8=14


第一位是记录开始标志位,这个基本肯定,而且标示了字段的数据类型。行记录字节数低于7字节的,用00补全,占用7字节。超过7字节的,按实际字段字节数存储。
用4个字段验证,字节数也是正确的。
...全文
1726 74 打赏 收藏 转发到动态 举报
写回复
用AI写文章
74 条回复
切换为时间正序
请发表友善的回复…
发表回复
mldhappy 2011-10-20
  • 打赏
  • 举报
回复
支持啦,确实很有专研精神。
涛涛_2009 2011-10-20
  • 打赏
  • 举报
回复
看来要学习这种精神……
poly3 2011-10-20
  • 打赏
  • 举报
回复
今天回复后怎么老是404
SUNKAISHENG 2011-10-20
  • 打赏
  • 举报
回复
不懂呢
ljx2316970 2011-10-19
  • 打赏
  • 举报
回复
感谢分享!
  • 打赏
  • 举报
回复
太专业,飘过下,等到研究级别的时候再看吧。

不过话说一般应用的话能够根据自己需求选择合理的数字类型就够了
yejiaa 2011-10-17
  • 打赏
  • 举报
回复
不能白进来留个脚印在走~~!
lijianbin9 2011-10-16
  • 打赏
  • 举报
回复
很强,很有深度 。顶!
silent879779909 2011-10-15
  • 打赏
  • 举报
回复
专业 专业 佩服
li_develop 2011-10-15
  • 打赏
  • 举报
回复
很强,很有深度 。顶!
fengleitao 2011-10-15
  • 打赏
  • 举报
回复
好方法
zuoxingyu 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 shine333 的回复:]
呵呵,我也搞一个。HOLD ON
[/Quote]
期待分享。
shine333 2011-10-14
  • 打赏
  • 举报
回复
呵呵,我也搞一个。HOLD ON
zuoxingyu 2011-10-14
  • 打赏
  • 举报
回复
44楼了,还没用引出玉。
冰岛男孩 2011-10-14
  • 打赏
  • 举报
回复
学习。……
lin57 2011-10-14
  • 打赏
  • 举报
回复
hao a
shine333 2011-10-14
  • 打赏
  • 举报
回复
这两天比较忙,可能要到下周才有机会研究。希望也能引出其他玉来
shine333 2011-10-14
  • 打赏
  • 举报
回复
我的表结构和你不同,都是not null有pk
zuoxingyu 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 shine333 的回复:]
窃以为,如果是varchar,在每行该字段的开始位置,应该就是记录这个字段长度的字节,然后才是数据位。
[/Quote]

看这个帖子
http://topic.csdn.net/u/20111012/09/6110254b-a68e-49d9-a18a-a061e9bebe89.html?96807
zuoxingyu 2011-10-14
  • 打赏
  • 举报
回复
52楼有问题,插入在optimize之前,总是插入到空洞里面的,和concurrent_insert 参数没用关系,纠正一下。

回55楼,我测试的“行记录字节数低于7字节的,用00补全,占用7字节”的论断不对,应该怎么测试呢?
int,tiny,bigint都是定长字段,所占字节为4,1,8,你测试的例子总长度已经超过7,到13了,所以没用在后面补00 ,如果不用bigint,就只有5字节,就会在后面补0

另外找到了liunx下以16进制查看你文件的方法如下:
[root@localhost DB]# hexdump -C rows.MYD
00000000 00 ff ff ff ff ff ff 00 00 00 00 00 00 00 f1 0a |................|
00000010 00 00 00 07 08 00 00 00 00 00 00 00 |............|
0000001c

加载更多回复(39)

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧