1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-08 03:53:48 +08:00
This commit is contained in:
源文雨
2022-05-03 01:29:08 +08:00
parent e24f761f34
commit bd6ce1d778
11 changed files with 636 additions and 35 deletions

View File

@@ -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#字符串)进行遍历。