Indexing ArangoDB 3.1查询解释程序

Indexing ArangoDB 3.1查询解释程序,indexing,arangodb,aql,Indexing,Arangodb,Aql,在对索引数据库执行AQL时,我发现我的查询速度要快得多。但是,查询解释程序声明没有使用索引。这怎么可能?是虫子吗?我在两个相同的数据库中运行相同的查询,只是其中一个有各种索引,而另一个没有索引。在索引数据库中,查询需要5秒钟。在非索引数据库中,查询需要13秒。这两个数据库都表示在解释查询时没有使用索引,并提供相同的执行计划和优化规则 查询: 指数 在索引数据库中: v0.attr具有:{hash:{unique:false,sparse:false}选择性为0.08% e1.category具

在对索引数据库执行AQL时,我发现我的查询速度要快得多。但是,查询解释程序声明没有使用索引。这怎么可能?是虫子吗?我在两个相同的数据库中运行相同的查询,只是其中一个有各种索引,而另一个没有索引。在索引数据库中,查询需要5秒钟。在非索引数据库中,查询需要13秒。这两个数据库都表示在解释查询时没有使用索引,并提供相同的执行计划和优化规则

查询: 指数 在索引数据库中:

  • v0.attr
    具有:
    {hash:{unique:false,sparse:false}
    选择性为0.08%
  • e1.category
    具有
    {hash:{unique:false,sparse:false}}
    的选择性为0.00%
  • e1.date
    具有
    {skiplist:{unique:false,sparse:false}
在非索引数据库中,唯一的索引是文档键和边缘标识符的默认值

在索引数据库中,查询速度明显快于非索引数据库,但两个数据库上的查询解释者都表示:

Indexes used:
 none
很明显,数据库正在使用索引,但查询解释者不会说如何使用。

(注意:只是给出了相同的答案,因为问题是相似的)

在ArangoDB 3.0中,遍历将始终使用边索引查找连接的顶点,而不管查询中存在哪些过滤条件,也不管存在哪些索引

在Arangodb3.1中,优化器将尝试为每个遍历级别找到最佳索引。它将检查遍历的过滤条件,并为每个级别选择它估计成本最低的索引。如果没有用户定义的索引,它仍将使用边索引查找连接的顶点。如果边属性上也有索引的过滤条件,并且该索引比边索引具有更好的估计平均选择性,则将使用其他索引

在3.1.0中,解释输出将始终显示遍历的“使用的索引:无”,即使遍历将始终使用索引。explain输出中缺少索引显示。这在Arangodb3.1.1中已经修复,它将显示优化器为每一级遍历选择的单个索引

例如,以下查询显示了3.1中的以下解释输出:

Query string:
 FOR v, e, p in 0..3 ANY 'v/test0' e 
   FILTER p.edges[0].type == 1 && p.edges[2].type == 2 
   RETURN p.vertices 

Execution plan:
 Id   NodeType          Est.   Comment
  1   SingletonNode        1   * ROOT
  2   TraversalNode     8000     - FOR v  /* vertex */, p  /* paths */ IN 0..3  /* min..maxPathDepth */ ANY 'v/test0' /* startnode */  e
  3   CalculationNode   8000     - LET #5 = ((p.`edges`[0].`type` == 1) && (p.`edges`[2].`type` == 2))   /* simple expression */
  4   FilterNode        8000     - FILTER #5
  5   CalculationNode   8000     - LET #7 = p.`vertices`   /* attribute expression */
  6   ReturnNode        8000     - RETURN #7

Indexes used:
 By   Type   Collection   Unique   Sparse   Selectivity   Fields                Ranges
  2   edge   e            false    false        10.00 %   [ `_from`, `_to` ]    base INBOUND
  2   edge   e            false    false        10.00 %   [ `_from`, `_to` ]    base OUTBOUND
  2   hash   e            false    false        63.60 %   [ `_to`, `type` ]     level 0 INBOUND
  2   hash   e            false    false        64.40 %   [ `_from`, `type` ]   level 0 OUTBOUND
  2   hash   e            false    false        63.60 %   [ `_to`, `type` ]     level 2 INBOUND
  2   hash   e            false    false        64.40 %   [ `_from`, `type` ]   level 2 OUTBOUND
其他索引出现在
[“\u-to”,“type”]
[“\u-from”,“type”]
上。这些用于遍历的级别0和2,因为这些级别上的边具有可以使用这些索引的过滤条件。对于所有其他级别,遍历将使用“范围”列中标有“base”的索引


explain output fix将在3.1.1中提供,该版本将很快发布。

您可以将您的AQL查询添加到问题中吗?查询的遍历部分不显示索引,尽管遍历将始终使用索引(或从3.1开始的多个索引)。我们正在解决这个问题。这回答了我的问题!
Query string:
 FOR v, e, p in 0..3 ANY 'v/test0' e 
   FILTER p.edges[0].type == 1 && p.edges[2].type == 2 
   RETURN p.vertices 

Execution plan:
 Id   NodeType          Est.   Comment
  1   SingletonNode        1   * ROOT
  2   TraversalNode     8000     - FOR v  /* vertex */, p  /* paths */ IN 0..3  /* min..maxPathDepth */ ANY 'v/test0' /* startnode */  e
  3   CalculationNode   8000     - LET #5 = ((p.`edges`[0].`type` == 1) && (p.`edges`[2].`type` == 2))   /* simple expression */
  4   FilterNode        8000     - FILTER #5
  5   CalculationNode   8000     - LET #7 = p.`vertices`   /* attribute expression */
  6   ReturnNode        8000     - RETURN #7

Indexes used:
 By   Type   Collection   Unique   Sparse   Selectivity   Fields                Ranges
  2   edge   e            false    false        10.00 %   [ `_from`, `_to` ]    base INBOUND
  2   edge   e            false    false        10.00 %   [ `_from`, `_to` ]    base OUTBOUND
  2   hash   e            false    false        63.60 %   [ `_to`, `type` ]     level 0 INBOUND
  2   hash   e            false    false        64.40 %   [ `_from`, `type` ]   level 0 OUTBOUND
  2   hash   e            false    false        63.60 %   [ `_to`, `type` ]     level 2 INBOUND
  2   hash   e            false    false        64.40 %   [ `_from`, `type` ]   level 2 OUTBOUND