【问题标题】:Why is sorting in arangodb slow?为什么在 arangodb 中排序很慢?
【发布时间】:2014-05-28 11:07:15
【问题描述】:

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

【问题讨论】:

    标签: arangodb


    【解决方案1】:

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

    目前有一些问题:

    1. 没有 FILTER 条件的 AQL 查询不会使用索引。
    2. skiplist 索引适用于前向遍历,但它没有后向遍历功能。

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

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

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

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

    【讨论】:

    • 有什么地方可以查看修复进度吗?
    • 这个问题的状态如何?
    • 上述问题和我的回答是指 ArangoDB 2.1 或 2.2。这些版本在反向排序时不使用索引进行排序,如果查询不包含FILTER 条件,则不使用索引。因此,建议的解决方法是使用 SKIPLIST 函数。 ArangoDB 2.3 解决了所有这些问题。如果排序属性上有适当的(跳过列表)索引,则不再需要解决方法。您可以通过解释查询来验证 2.3 中是否使用了索引。
    • Re @Wouter:我们的 Github 问题跟踪器将是跟踪问题的合适位置:github.com/triAGENS/ArangoDB/issues
    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2011-01-16
    • 2017-05-26
    • 2010-10-11
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多