为什么在arangodb中排序很慢?

时间:2014-05-28 11:07:15

标签: arangodb

我正在试验看arangodb是否适合我们的用例。 我们将拥有大量具有相同模式的文档集合(如sql表)。

为了尝试一些查询,我已经插入了大约90K的文档,这些文档很少,因为我们希望文档数量大约为100万。

现在我想获得这些文档的简单页面,不需要过滤,但需要降序排序。

所以我的aql是:

for a in test_collection
sort a.ARTICLE_INTERNALNR desc
limit 0,10
return {'nr': a.ARTICLE_INTERNALNR}

当我在AQL编辑器中运行它时,它需要大约7秒,而我预计会有几毫秒或类似的东西。

我尝试在其上创建哈希索引和跳转列表索引,但这没有任何效果:

 db.test_collection.getIndexes()
[ 
  { 
    "id" : "test_collection/0", 
    "type" : "primary", 
    "unique" : true, 
    "fields" : [ 
      "_id" 
    ] 
  }, 
  { 
    "id" : "test_collection/19812564965", 
    "type" : "hash", 
    "unique" : true, 
    "fields" : [ 
      "ARTICLE_INTERNALNR" 
    ] 
  }, 
  { 
    "id" : "test_collection/19826720741", 
    "type" : "skiplist", 
    "unique" : false, 
    "fields" : [ 
      "ARTICLE_INTERNALNR" 
    ] 
  } 
]

那么,我错过了什么,或ArangoDB不适合这些情况?

1 个答案:

答案 0 :(得分:3)

如果ArangoDB需要对所有文档进行排序,这将是一个相对较慢的操作(与不排序相比)。因此,目标是避免排序。 ArangoDB有一个跳转列表索引,它按索引的顺序保存索引值,如果可以在查询中使用它,它将加快查询速度。

目前有一些陷阱:

  1. 没有FILTER条件的AQL查询将不使用索引。
  2. 跳转列表索引适用于转发顺序遍历,但它没有向后顺序遍历工具。
  3. 这些问题似乎都影响了你。 我们希望尽快解决这两个问题。

    目前有一种解决方法可以使用AQL查询强制使用转发顺序中的索引,如下所示:

    FOR a IN 
      SKIPLIST(test_collection, { ARTICLE_INTERNALNR: [ [ '>', 0 ] ] }, 0, 10) 
    RETURN { nr: a.ARTICLE_INTERNALNR }
    

    以上通过ARTICLE_INTERNALNR上的索引以条件“值> 0”获取前10个文档。我不确定是否存在向后排序的解决方案。