multi_index_container

multi_index_container

本文关键字:container index multi      更新时间:2023-10-16

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

例如,给定设备之间的连接列表,我想搜索源为'server'且目的地为'pc2'的所有元素。我有一个索引在源和一个索引在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(以匹配'server'),然后在这些迭代器之间进行线性搜索,以找到在"Dest"列中匹配的元素,但这不是很令人满意,因为我有第二个索引。是否有一种类似于stl/boost的优雅方法来利用存在两个索引的事实并避免线性搜索(或等量的工作,例如将所有中间结果添加到另一个容器中,等等)?

(显然,在这个例子中,线性搜索是最快的,但如果有10000个条目以'server'作为源,那么使用第二个索引将开始变得更好。)

任何想法都是赞赏的!

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

…但是首先我们需要揭开索引的神秘面纱。

<<p> 复合索引/strong>

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

  • 常规索引:单列索引
  • 复合索引:一次在多个列上索引

两者给出不同的性能结果。当您需要使用两个索引时,有一个合并通道来组合它们给出的结果(也称为连接),因此复合索引可以提供速度提升。

多索引

Boost多索引可以使用复合索引,毕竟您可以自由地提供自己的哈希或比较函数。

与关系数据库的一个关键区别是,您不能有一个有效的合并通道(合并两个ROWID集),因为这需要内在的知识才能有效,因此您确实被第一次搜索结果中的线性搜索所困住了。这取决于你找到最具鉴别力的第一个搜索。


注意:multi-index这个名字是指当你插入、更新和删除元素时,它会自动维护多个索引的想法。这还意味着您可以使用这些索引中的任何一个来搜索您所决定的性能配置文件。但它并不是一个具有统计、启发式和查询引擎的成熟的数据库引擎。

执行关系数据库样式查询的最优雅的方法是使用关系数据库。我不是轻率;你使用了错误的数据结构。如果"关系数据库风格的查询"操作是你经常要做的事情,我强烈建议你投资SQLite。

Boost的目的。MultiIndex不是一个又快又脏的数据库。