|
|
@ -49,6 +49,8 @@ |
|
|
|
## 一,实验目的 |
|
|
|
在 LevelDB 的基础上设计和实现一个支持二级索引的功能,优化特定字段的查询效率。通过此功能,用户能够根据字段值高效地检索对应的数据记录,而不需要遍历整个数据库。 |
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
@ -86,6 +88,8 @@ name:Customer#000000002-k_2 : k_2 |
|
|
|
- **灵活性**:允许用户指定需要创建索引的字段,支持动态创建和删除索引。 |
|
|
|
- **易用性**:通过统一接口隐藏索引管理的复杂性,保持与原始 LevelDB 类似的用户体验。 |
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
@ -96,7 +100,7 @@ name:Customer#000000002-k_2 : k_2 |
|
|
|
## 三,`LevelDB`二级索引设计思路 |
|
|
|
|
|
|
|
#### 1. **设计结构** |
|
|
|
在 ·LevelDB· 的基础上扩展,补充并实现以下组件: |
|
|
|
在 `LevelDB` 的基础上扩展,补充并实现以下组件: |
|
|
|
|
|
|
|
##### 2.1 **核心组件** |
|
|
|
1. **主数据库(DBImpl)**: |
|
|
@ -222,6 +226,8 @@ lessCopy code 主数据库 (DBImpl) |
|
|
|
|
|
|
|
这套设计在功能性、一致性和性能之间达到了较好的平衡,能够为 LevelDB 提供高效、灵活的二级索引支持,同时保持其原有的高性能特性。 |
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
|
|
|
@ -492,8 +498,9 @@ Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { |
|
|
|
#### 实现意义 |
|
|
|
这种设计确保了主数据库和二级索引数据库的一致性,即便在部分写入或删除操作失败的情况下,仍能通过回滚机制保证数据的完整性和原子性。 |
|
|
|
|
|
|
|
--- |
|
|
|
<br> |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -576,6 +583,8 @@ Level Files Size(MB) Time(sec) Read(MB) Write(MB) |
|
|
|
- **删除索引的时间**:删除索引需要稍长时间,这也是常见的现象。 |
|
|
|
|
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
@ -654,10 +663,11 @@ if (!s.ok()) { |
|
|
|
|
|
|
|
通过以上方案,有效解决了实验中遇到的问题,并提高了系统的稳定性和一致性。 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## 总结 |
|
|
|
本实验通过在 `DBImpl` 中集成索引管理功能,实现了对二级索引的创建、查询和删除。二级索引数据存储在独立的 `indexDb_` 中,通过高效的键值映射提升了字段值查询的效率。 |