1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-09 04:30:34 +08:00

半完成bucket

This commit is contained in:
源文雨
2022-10-09 00:49:35 +08:00
parent 18513f6e6f
commit 2dd269b364
4 changed files with 153 additions and 5 deletions

View File

@@ -50,8 +50,8 @@
## int32/float
> 查找速度为O(logn)
使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=341`个扇出,`340`个值;最少则有`170`个值(根节点不遵守最少值规则)。
> 下面每格4字节
- 使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=341`个扇出,`340`个值;最少则有`170`个值(根节点不遵守最少值规则)。
> 下面每格4字节, next node ptr 将所有块连接起来以便全部遍历(如删除)。
```
0 8 12 20
┌───────────────────┬─────────┬───────────────────┬─────────┐
@@ -69,11 +69,31 @@
└───────────────────┴───────────────────┘
4088 4096
```
> 备选方案
- 使用哈希桶作索引,允许溢出桶,同样每个桶大小为`4096`字节,可装`340`个值。共`256`个桶,初始占用`1M`空间,后续由于溢出可能会增加。
```
0 8 12 20
┌───────────────────┬─────────┬───────────────────┬─────────┐
0│ pointer 001 │ key 001 │ pointer 002 │ key 002 │
├───────────────────┼─────────┼───────────────────┼─────────┤
24│ pointer 003 │ key 003 │ pointer 004 │ key 004 │
├───────────────────┼─────────┼───────────────────┼─────────┤
48│ pointer 005 │ key 005 │ pointer 006 │ key 006 │
├───────────────────┼─────────┼───────────────────┼─────────┤
xxx│ pointer xxx │ key xxx │ pointer xxx │ key xxx │
├───────────────────┼─────────┼───────────────────┼─────────┤
4056│ pointer 339 │ key 339 │ pointer 340 │ key 340 │
├───────────────────┼─────────┴─────────┬─────────┴─────────┘
4080│ overflow ptr │ next node ptr │
└───────────────────┴───────────────────┘
4088 4096
```
## int64/double
> 查找速度为O(logn)
使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=256`个扇出,`255`个值;最少则有`128`个值(根节点不遵守最少值规则)。
> 下面每格8字节
- 使用B+树建立索引,每个节点大小为`4096`字节,最多可有`n=256`个扇出,`255`个值;最少则有`128`个值(根节点不遵守最少值规则)。
> 下面每格8字节, next node ptr 将所有块连接起来以便全部遍历(如删除)。
```
0 8
┌───────────────────┬───────────────────┐
@@ -91,7 +111,27 @@
└───────────────────┴───────────────────┘
4088 4096
```
> 备选方案
- 使用哈希桶作索引,允许溢出桶,同样每个桶大小为`4096`字节,可装`255`个值。共`1024`个桶,初始占用`4M`空间,后续由于溢出可能会增加。
```
0 8
┌───────────────────┬───────────────────┐
0│ pointer 001 │ key 001 │
├───────────────────┼───────────────────┤
16│ pointer 002 │ key 002 │
├───────────────────┼───────────────────┤
32│ pointer 003 │ key 003 │
├───────────────────┼───────────────────┤
xxx│ pointer xxx │ key xxx │
├───────────────────┼───────────────────┤
4064│ pointer 255 │ key 255 │
├───────────────────┼───────────────────┤
4080│ overflow ptr │ next node ptr │
└───────────────────┴───────────────────┘
4088 4096
```
## string
> 查找速度为O(logn)
先将其哈希为int64再按int64进行查找。具体哈希方法为取字符串`md5`的前8位作为小`uint64`。冲突时根据string表项附带存储的[下一个哈希相同的数据项的指针(uint64)](/api/types.md#字符串)可依次遍历到所有项目,然后找到真正与查询内容相同的项。
先将其哈希为int64再按int64进行查找。具体哈希方法为取字符串`md5`的前8位作为小`uint64`。冲突时根据string表项附带存储的[下一个哈希相同的数据项的指针(uint64)](/api/types.md#字符串)可依次遍历到所有项目,然后找到真正与查询内容相同的项。