3

我正在尝试看看 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 不适合这些情况?

4

1 回答 1

4

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

目前有几个问题:

  1. 没有 FILTER 条件的 AQL 查询不会使用索引。
  2. 跳过列表索引适用于前向遍历,但它没有后向遍历工具。

这两个问题似乎都影响了你。我们希望尽快解决这两个问题。

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

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

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

于 2014-05-29T09:42:06.157 回答