繁体   English   中英

为什么在arangodb中排序缓慢?

[英]Why is sorting in arangodb slow?

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

为了尝试一些查询,我插入了大约9万个文档,这很低,因为我们希望文档数量在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需要对所有文档进行排序,这将是一个相对较慢的操作(与不排序相比)。 因此,目标是完全避免排序。 ArangoDB有一个跳过列表索引,该索引将索引值保持在已排序的顺序,并且如果可以在查询中使用它,则将加快查询速度。

目前有一些陷阱:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM