mirror of
https://github.com/fumiama/fumidb.git
synced 2026-06-08 03:53:48 +08:00
int16
This commit is contained in:
30
api/index.md
30
api/index.md
@@ -10,7 +10,7 @@
|
||||
│ ptr 000 │ ptr 001 │ ptr ... │ ptr 255 │
|
||||
└─────────┴─────────┴─────────┴─────────┘
|
||||
```
|
||||
特别地,当值可重复时,索引指向的是一个链表的头,详见[types](/api/types.md#数字)。
|
||||
当值可重复时,索引指向的是一个链表的头,详见[types](/api/types.md#数字)。
|
||||
## int16
|
||||
> 查找速度为
|
||||
> - 无该表项:O(1)
|
||||
@@ -18,30 +18,38 @@
|
||||
|
||||
由于总条目仅有65536条,因此使用位图索引+位图+顺序链表进行查找定位。
|
||||
### 位图与位图索引
|
||||
每一位代表一个槽位,为0表示当前为空,为1表示当前已有值,按顺序排列。
|
||||
每一位代表一个槽位,为0表示当前为空,为1表示当前已有值,按顺序排列,占用文件中的`65536/8/4096=2`页空间。
|
||||
> 下面每格1字节
|
||||
```
|
||||
┌────────┬────────┬────────┬────────┐
|
||||
│00100011│00000000│11001010│11000110│
|
||||
│00100011│00000000│........│11000110│
|
||||
└────────┴────────┴────────┴────────┘
|
||||
```
|
||||
每256位(32字节)为一组,生成8位(1字节)位图索引,插在该组最前。该值指示在这256个槽位中有多少个已被填充。特别地,如果256个槽位均被填满,索引也为`0`,因此还需要额外判断其对应位图是全空还是全满。只要有一处不为0而位图索引为0,即可判定这256个槽位全满。
|
||||
每256位(32字节)为一组,生成8位(1字节)位图索引,其数字值表示在这256个槽位中有多少个已被填充。总共有`256`组索引,作为第一级`index`,单独在一个块存放,并在开头添加3个分别指向2页索引起始和顺序链表起始的指针。特别地,如果256个槽位均被填满,索引也为`0`,因此还需要额外判断其对应位图是全空还是全满。只要有一处不为0而位图索引为0,即可判定这256个槽位全满。
|
||||
> 下面每格1字节
|
||||
```
|
||||
┌────────┬────────┬────────┬────────┐
|
||||
│ 30 │ No.000 │ No.... │ No.255 │
|
||||
└────────┴────────┴────────┴────────┘
|
||||
┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
|
||||
│ pointer of first index page start ( this pointer will never be zero ) │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│ pointer of second index page start ( this pointer will never be zero ) │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│ pointer of index chain start ( this pointer will never be zero ) │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│ 0000 │ 0045 │ 0100 │ 0065 │ 0000 │ .... │ 0033 │ 0000 │
|
||||
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
|
||||
```
|
||||
### 顺序链表
|
||||
根据位图和位图索引可以很方便地计算出当前值在顺序链表上的位置。顺序链表以256个uint64的位置指针为单位分配,当装满后分配一块新的空间,并将新链表开头的位置指针记录在旧链表开头。当没有下一个节点时,开头置0。特别地,当删除表项时,节点数有可能减少。此时并不归还多余节点所占空间,也不对节点头部指针做任何改动,而是将其保留以备后用。
|
||||
根据位图和位图索引可以很方便地计算出当前值在顺序链表上的位置。顺序链表以256个uint64的位置指针(半页)为单位分配,当装满后分配一块新的空间,并将新链表开头的位置指针记录在旧链表开头。当没有下一个节点时,开头置0。特别地,当删除表项时,节点数有可能减少。此时并不归还多余节点所占空间,也不对节点头部指针做任何改动,而是将其保留以备后用。
|
||||
> 下面每格8字节
|
||||
```
|
||||
┌────────┬────────┬────────┬────────┐
|
||||
│next ptr│ ptr000 │ ptr... │ ptr255 │
|
||||
└────────┴────────┴────────┴────────┘
|
||||
```
|
||||
特别地,当值可重复时,索引指向的是一个链表的头,详见[types](/api/types.md#数字)。
|
||||
当值可重复时,索引指向的是一个链表的头,详见[types](/api/types.md#数字)。
|
||||
## int32/float
|
||||
> 查找速度为O(logn)
|
||||
|
||||
使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=341`个扇出,`340`个值;最少则有`170`个值(根节点不遵守最少值规则)。
|
||||
> 下面每格4字节
|
||||
```
|
||||
@@ -62,6 +70,8 @@
|
||||
4088 4096
|
||||
```
|
||||
## int64/double
|
||||
> 查找速度为O(logn)
|
||||
|
||||
使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=256`个扇出,`255`个值;最少则有`128`个值(根节点不遵守最少值规则)。
|
||||
> 下面每格8字节
|
||||
```
|
||||
@@ -82,4 +92,6 @@
|
||||
4088 4096
|
||||
```
|
||||
## string
|
||||
> 查找速度为O(logn)
|
||||
|
||||
先将其哈希为int64再按int64进行查找。冲突时根据string表项附带存储的[下一个哈希相同的数据项的指针(uint64)](/api/types.md#字符串)进行遍历。
|
||||
|
||||
Reference in New Issue
Block a user