ArangoDB 索引在边集合中的使用
ArangoDB Index usage with edge collections
任务:更新许多边属性的最快方法。出于性能原因,我忽略了图形方法并直接使用集合进行过滤。
ArangoDB 2.8b3
查询【报价-缘合集】:
FOR O In Offer
FILTER O._from == @from and O._to == @to and O.expired > DATE_TIMESTAMP(@newoffertime)
UPDATE O WITH { expired: @newoffertime } IN Offer
RETURN { _key: OLD._key, prices_hash: OLD.prices_hash }
我有 _to、_from 的系统索引和过期的范围索引
查询说明显示
7 edge Offer false false 49.51 % [ `_from`, `_to` ] O.`_to` == "Product/1023058135528"
系统索引仅用于过滤部分记录(_to),而不用于两者(_from, _to),'expired' 索引也未使用。请向我解释这种行为的原因,如果我在规划数据模型时确定知道,是否有可能指定用于最短路径的索引提示?
对于查询中与逻辑 AND 组合的过滤条件,ArangoDB 的查询优化器将选择一个索引。这就是为什么它没有同时选择边缘索引和跳表索引的原因。
它将在 expired
上的跳过列表索引和 [ "_from", "_to" ]
上的边缘索引之间进行选择,并将选择它确定成本较低的一个,这是通过索引选择性来衡量的估计。正如解释输出所示,它似乎选择了 _to
上的边缘索引。
边缘索引在内部由两个单独的哈希索引组成,一个在 _from
属性上,一个在 _to
属性上,因此它允许通过 _from
和_to
属性。但是,它 不是 [ "_from", "_to" ]
上的组合索引,因此它不支持同时请求 _from
和 _to
的查询。它必须选择一个内部哈希索引,并且似乎在该查询中选择了 _to
上的索引。该决定再次基于平均索引选择性。
没有办法向优化器提供任何索引使用提示 - 除此之外,它不能为这个特定查询同时使用两个索引。
查看解释输出中的选择性估计,边缘索引似乎不是很有选择性,这意味着会有很多具有相同 _to
值的边缘。由于优化器还应该考虑 _from
上的索引,我会假设索引的选择性更低,并且这些索引中的每一个只会帮助跳过最多 50% 的边缘,这不是非常。如果确实如此,那么查询仍将检索(和 post-filter)大量文档,这解释了潜在的缓慢。
目前属性 _from
和 _to
在边集合的 always-present 边索引中自动建立索引,它们不能用于额外的 user-defined 索引.
这是我们希望在未来版本中添加的一项功能,因为 _from
和 _to
可用于 user-defined 索引,因此可以在 [= 上创建组合(排序)索引27=] 这可能比孤立的三个 single-attribute 索引中的任何一个都更具选择性。
任务:更新许多边属性的最快方法。出于性能原因,我忽略了图形方法并直接使用集合进行过滤。
ArangoDB 2.8b3
查询【报价-缘合集】:
FOR O In Offer
FILTER O._from == @from and O._to == @to and O.expired > DATE_TIMESTAMP(@newoffertime)
UPDATE O WITH { expired: @newoffertime } IN Offer
RETURN { _key: OLD._key, prices_hash: OLD.prices_hash }
我有 _to、_from 的系统索引和过期的范围索引
查询说明显示
7 edge Offer false false 49.51 % [ `_from`, `_to` ] O.`_to` == "Product/1023058135528"
系统索引仅用于过滤部分记录(_to),而不用于两者(_from, _to),'expired' 索引也未使用。请向我解释这种行为的原因,如果我在规划数据模型时确定知道,是否有可能指定用于最短路径的索引提示?
对于查询中与逻辑 AND 组合的过滤条件,ArangoDB 的查询优化器将选择一个索引。这就是为什么它没有同时选择边缘索引和跳表索引的原因。
它将在 expired
上的跳过列表索引和 [ "_from", "_to" ]
上的边缘索引之间进行选择,并将选择它确定成本较低的一个,这是通过索引选择性来衡量的估计。正如解释输出所示,它似乎选择了 _to
上的边缘索引。
边缘索引在内部由两个单独的哈希索引组成,一个在 _from
属性上,一个在 _to
属性上,因此它允许通过 _from
和_to
属性。但是,它 不是 [ "_from", "_to" ]
上的组合索引,因此它不支持同时请求 _from
和 _to
的查询。它必须选择一个内部哈希索引,并且似乎在该查询中选择了 _to
上的索引。该决定再次基于平均索引选择性。
没有办法向优化器提供任何索引使用提示 - 除此之外,它不能为这个特定查询同时使用两个索引。
查看解释输出中的选择性估计,边缘索引似乎不是很有选择性,这意味着会有很多具有相同 _to
值的边缘。由于优化器还应该考虑 _from
上的索引,我会假设索引的选择性更低,并且这些索引中的每一个只会帮助跳过最多 50% 的边缘,这不是非常。如果确实如此,那么查询仍将检索(和 post-filter)大量文档,这解释了潜在的缓慢。
目前属性 _from
和 _to
在边集合的 always-present 边索引中自动建立索引,它们不能用于额外的 user-defined 索引.
这是我们希望在未来版本中添加的一项功能,因为 _from
和 _to
可用于 user-defined 索引,因此可以在 [= 上创建组合(排序)索引27=] 这可能比孤立的三个 single-attribute 索引中的任何一个都更具选择性。