|
|
@ -39,6 +39,9 @@ |
|
|
|
- [六,问题与解决方案](#六问题与解决方案) |
|
|
|
- [总结](#总结) |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 一,实验目的 |
|
|
@ -46,6 +49,9 @@ |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 二,项目背景概述 |
|
|
|
|
|
|
|
#### 1. **背景与需求** |
|
|
@ -78,6 +84,9 @@ name:Customer#000000002-k_2 : k_2 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 三,`LevelDB`二级索引设计思路 |
|
|
|
|
|
|
|
#### 1. **设计结构** |
|
|
@ -209,6 +218,9 @@ lessCopy code 主数据库 (DBImpl) |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 四,具体实现 |
|
|
|
|
|
|
|
### 1. **DBImpl 类的设计** |
|
|
@ -473,6 +485,10 @@ Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { |
|
|
|
这种设计确保了主数据库和二级索引数据库的一致性,即便在部分写入或删除操作失败的情况下,仍能通过回滚机制保证数据的完整性和原子性。 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 五,性能测试 |
|
|
|
### 1.测试流程 |
|
|
|
|
|
|
@ -553,6 +569,9 @@ Level Files Size(MB) Time(sec) Read(MB) Write(MB) |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 六,问题与解决方案 |
|
|
|
|
|
|
|
### 1. **问题:如何避免** `**indexDb_**` **的递归调用?** |
|
|
@ -625,5 +644,8 @@ if (!s.ok()) { |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 总结 |
|
|
|
本实验通过在 `DBImpl` 中集成索引管理功能,实现了对二级索引的创建、查询和删除。二级索引数据存储在独立的 `indexDb_` 中,通过高效的键值映射提升了字段值查询的效率。 |