10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
cyq 7dd7726f98 清除插桩 8ヶ月前
.github/workflows Fix GitHub CI on Linux. 删除 2年前
benchmarks Merge branch 'cyq' into ld 删除 8ヶ月前
cmake Align CMake configuration with related projects. 删除 5年前
db 清除插桩 删除 8ヶ月前
doc The master branch was renamed to main. 删除 3年前
fielddb 上条没注释完全 删除 8ヶ月前
helpers/memenv Remove main() from most tests. 删除 3年前
include/leveldb fielddb的benchmark、性能插桩以及一个对比的testdb 删除 8ヶ月前
issues Remove main() from most tests. 删除 3年前
port Support Zstd compression level in Leveldb 删除 2年前
table leveldb: Check slice length in Footer::DecodeFrom() 删除 2年前
test 插桩会影响恢复测试(env的问题)先注释了 删除 8ヶ月前
testdb 查出了性能测试destroy错误的问题 删除 8ヶ月前
third_party Roll third_party/benchmark to f7547e29ccaed7b64ef4f7495ecfff1c9f6f3d03 删除 2年前
util Merge branch 'cyq' into ld 删除 8ヶ月前
.clang-format Consolidate benchmark code to benchmarks/. 6年前
.gitignore fielddb的benchmark、性能插桩以及一个对比的testdb 8ヶ月前
.gitmodules Added google/benchmark submodule. 4年前
3DB设计.md 并发控制的基本框架和大部分实现 9ヶ月前
AUTHORS Release LevelDB 1.14 12年前
CMakeLists.txt fielddb的benchmark、性能插桩以及一个对比的testdb 8ヶ月前
CONTRIBUTING.md Update contributing guidelines. 3年前
LICENSE reverting disastrous MOE commit, returning to r21 14年前
NEWS sync with upstream @ 21409451 14年前
README.md 实验报告框架 8ヶ月前
TODO Update to leveldb 1.6 13年前
设计文档.md 分工与补充 9ヶ月前

README.md

实验报告

仓库地址 https://gitea.shuishan.net.cn/10225501448/leveldb_proj2

1. 项目概述

leveldb中的存储原本只支持简单的字节序列,在这个项目中我们对其功能进行拓展,使其可以包含多个字段,并通过这些字段实现类似数据库列查询的功能。但如果仅通过字段查找数据,需要对整个数据库的遍历,不够高效,因此还要新增二级索引,提高对特定字段的查询效率。

2. 功能实现

2.1 字段

设计目标:对value存储读取时进行序列化编码,使其支持字段。

实现思路:设计之初有考虑增加一些元数据(例如过滤器、字段偏移支持二分)来加速查询。但考虑到在数据库中kv的数量是十分庞大的,新加数据结构会带来巨大的空间开销。因此我们决定在这里牺牲时间换取空间,而将时间的加速放在索引中。
在这一基础上,我们对序列化进行了简单的优化:将字段名排序后,一一调用leveldb中原本的编码方法PutLengthPrefixedSlice存入value。这样不会有额外的空间开销,而好处在于遍历一个value的字段时,如果得到的字段名比目标大,就可以提前结束遍历。

std::string SerializeValue(const FieldArray& fields){
    std::sort(sortFields.begin(), sortFields.end(), compareByFirst);
    for (const Field& pairs : sortFields) {
        PutLengthPrefixedSlice(&result, pairs.first);
        PutLengthPrefixedSlice(&result, pairs.second);
    }
    return result;
}

最终db类提供了新接口putFields, getFields,分别对传入的字段序列化后调用原来的put, get接口。
FindKeysByField调用NewIterator遍历所有数据,field名和值符合则加入返回的key中。
这一部分的具体代码在util/serialize_value.cc中

2.2 二级索引

设计目标:对某个字段(属性)建立索引,提高对该字段的查询效率。

2.2.1 总体架构

fielddb

2.2.2 如何并发创删索引与读写

request

2.2.3 如何保证两个kv与index的一致性

metadb

3. 测试

3.1 正确性测试

3.2 性能测试

测试、分析、优化

4. 问题与解决

5. 潜在优化点

6. 分工