You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单ordered_non_unique索引与双hashed_non_unique索引的选型对比

员工查询/删除的索引方案选择

假设我们需要按以下两种条件查询或删除员工:

  • 仅按部门操作
  • 按部门+姓名组合操作

方案一:单复合有序非唯一索引

用一个ordered_non_unique复合索引就能支持上述两种查询/删除场景(利用部分键查找特性),代码实现如下:

boost::multi_index::ordered_non_unique<
              boost::multi_index::tag<ByDepartmentAndName>,
              boost::multi_index::composite_key<
                  boost::multi_index::member<
                      Employee, int, &Employee::department>,
                  boost::multi_index::member<
                      Employee, std::string, &Employee::name>>>

方案二:两个独立哈希非唯一索引

定义两个独立的hashed_non_unique索引,分别对应两种查询条件,代码如下:

boost::multi_index::hashed_non_unique<
              boost::multi_index::tag<ByDepartmentAndName>,
              boost::multi_index::composite_key<
                  boost::multi_index::member<
                      Employee, int, &Employee::department>,
                  boost::multi_index::member<
                      Employee, std::string, &Employee::name>>>,
boost::multi_index::hashed_non_unique<
              boost::multi_index::tag<ByDepartment>, 
              boost::multi_index::member<
                      Employee, int, &Employee::department>>

怎么选?看这几点

1. 空间占用

方案一更省内存——只维护一个索引结构,不用重复存储部门字段的哈希索引数据,空间优势很明显。

2. 查询性能

方案二的哈希索引平均查询复杂度是O(1),理论上比方案一有序索引的O(logN)更快,但实际性能要考虑哈希冲突、负载因子这些因素。如果数据量不大,两者的速度差异其实感觉不出来。

3. 额外业务需求

  • 如果需要按部门排序输出员工,或者做范围查询(比如“部门ID从10到20的员工”),方案一的有序索引直接就能支持,哈希索引做不到这点。
  • 哈希索引在高并发场景下处理冲突可能有额外开销,有序索引的插入、删除操作稳定性更好。

总结建议

  • 选方案一:如果对内存占用敏感、需要有序遍历部门数据,或者数据量不大,单复合有序索引足够高效还省资源。
  • 选方案二:如果部门查询、部门+姓名查询的频率极高,数据量又特别大,而且不需要有序遍历的需求,哈希索引的性能优势会更突出。

内容的提问来源于stack exchange,提问作者Konstantin Milyutin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:00:18