的multi_index_container

时间:2011-09-14 04:07:24

标签: c++ boost stl

所以我有一个boost::multi_index_container有多个非唯一索引。我想找到一种优雅的方法来执行关系数据库样式查询,以使用多个索引查找与一组条件匹配的所有元素。

例如,给定设备之间的连接列表,我想搜索源为“服务器”且目的地为“pc2”的所有元素。我有一个关于Source的索引和关于Dest的索引。

Source     Dest/Port
----       ---------
server     pc1  23
server     pc1  27
server     pc1  80
server     pc2  80    <- want to find these two
server     pc2  90    <-
printer    pc3  110
printer    pc1  110
scanner    mac  8080

通常我可能在第一个索引上做lower_boundupper_bound(匹配'服务器'),然后在这些迭代器之间进行线性搜索,以找到在“Dest”列中匹配的那些元素,但这不是很令人满意,因为我有第二个索引。是否有一种优雅的类似stl / boost的方式来利用有两个索引并避免线性搜索(或等量的工作,例如将所有中间结果添加到另一个容器等)这一事实?

(显然在这个例子中,线性搜索会是最快的,但是如果有10000个以'server'作为源的项目,那么第二个索引就会变得很好。)

感谢任何想法!

2 个答案:

答案 0 :(得分:1)

执行关系数据库样式查询的最佳方式是使用关系数据库。我不是轻浮的;你使用的是错误的数据结构。如果“关系数据库样式查询”操作将成为您经常做的事情,我强烈建议您投资SQLite。

Boost.MultiIndex的目的不是一个快速而肮脏的数据库。

答案 1 :(得分:1)

您可能只是从关系数据库中获得灵感......

......但首先我们需要揭开关于索引的神秘面纱。

复合索引

在关系数据库中有两种类型的索引:

  • 常规索引:一列索引
  • 复合索引:一次多个列的索引

两者给出了不同的表现结果。当你需要使用两个索引时,有一个合并传递来组合它们给出的结果(也称为连接),因此复合索引可以提高速度。

<强>多索引

Boost多索引可以使用复合索引,毕竟你可以自由提供自己的哈希或比较功能。

与关系数据库的关键区别在于,您无法进行有效的合并传递(合并两个ROWID集),因为这需要内在知识才能有效,因此您确实难以在第一次搜索的结果中进行线性搜索。您可以找到最具判别力的第一次搜索。


注意:多索引名称是指在插入,更新和删除元素时自动维护多个索引的想法。这也意味着您可以使用您决定的性能配置文件使用任何这些索引进行搜索。但它不是一个包含统计数据,启发式和查询引擎的完整数据库引擎。