MySQL 内核解析之协议分析NULL-Bitmap (NULL位图)

21 篇文章 0 订阅
9 篇文章 0 订阅

参考官方文档:
https://dev.mysql.com/doc/internals/en/null-bitmap.html

位图解决了列存储的问题;

一、在MySQL数据通信中,采用两种通信方式:
1、文本格式Text : 发送全字节;
2、二进制格式Binary : 位图形式发送,省流;

For the Binary Protocol Resultset Row the num-fields and the field-pos
need to add a offset of 2. For COM_STMT_EXECUTE this offset is 0.
翻译简略:对于二进制协议,相关的Row需要对其有偏移量。

二:NULL位图
1、需要有足够的空间存储NULL的位图,空间(需要占用的内存位数,例如00 00,两个位)计算方式:

NULL-bitmap-bytes = (num-fields + 7 + offset) / 8

实例:
(1) num-fields+offset = 0 时;
bit = (0+7)/8 = 0

(2) num-fields+offset = 1 时;
bit = (1+7)/8 = 1

(3) num-fields+offset = 2 时;
bit = (2+7)/8 = 1

(4) num-fields+offset = 3 时;
bit = (3+7)/8 = 1

…(略)
(9) num-fields+offset = 8 时;
bit = (8+7)/8 = 1

(10) num-fields+offset = 9 时;
bit = (9+7)/8 = 2

(11) num-fields+offset = 10 时;
bit = (10+7)/8 = 2
…(略)

2、存储表示,在拥有了空间之后,用来表示NULL,例如(00 00两个空间,存储了的数据之后表示 00 04)
(1)表示方式计算:

NULL-bitmap-byte = ((field-pos + offset) / 8)
NULL-bitmap-bit = ((field-pos + offset) % 8)

(2)样例

Resultset Row, 9 fields, 9th field is a NULL
(9th field -> field-index == 8, offset == 2)

9个字段,第9个字段为NULL,形如:
field: 1| 2| 3| 4| 5| 6| 7| 8| NULL
index: 0| 1| 2| 3| 4| 5| 6| 7| 8
在这种Row协议下,固定的偏移值为2;

num-fields = 9
field-pos = 8
offset = 2

那么内存空间为 (num-fields + 7 + offset) / 8 = (9+7+2)/8 = 2,所以占用2个字符空间;
设 nulls -> [00] [00]

byte_pos =((field-pos + offset) / 8) = (8+2 / 8) = 1
bit_pos = ((field-pos + offset) % 8) = (8+2 % 8) = 2

nulls[byte_pos] |= 1 << bit_pos

即:

nulls[1] |= 1 << 2 = 4

所以:

nulls -> [00] [04]

3、深化理解样例
一行数据(Row),200个字段(200-field),其中,索引0-179共180个字段为NULL,剩下的都是有数据的,形如
0-179 | 180|…| 199
NULL | X|X… | X
那么需要的空间为
(200+7+2)/8 = 26个字符表示,00 00 00 … 共26个,设NULL[00][00][00]…[00]
其中:
(1)第一个字段(index = 0 ),则标记为
byte_pos = (0+2)/8 = 0
bit_pos = (0+2)%8 = 2
综合得出:
NULL [0] |= 1 << 2
记得:NULL [00] [00] [00] …[04]
其中04 = 0000 0100

(2)第二个字段(index = 1 ),则标记为
byte_pos = (1+2)/8 = 0
bit_pos = (1+2)%8 = 3
综合得出:
NULL [0] |= 1 << 3
记得:NULL [00] [00] [00] …[0c]
其中0c = 0000 1100

其他情况省略;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值