【发布时间】:2015-10-29 15:40:58
【问题描述】:
我正在通过 Strongloop 将 ArangoDB 用于 Web 应用程序。 我在运行此查询时遇到了一些性能问题:
FOR result IN Collection SORT result.field ASC RETURN result
我添加了一些索引来加快查询速度,例如排序字段上的skiplist 索引。
我的收藏有超过 100 万条记录。
该应用程序托管在 Google Cloud 上的 n1-highmem-2 上。 以下是一些规格:
- 2 个 CPU - Xeon E5 2.3Ghz
- 13 GB 内存
- 10GB 固态硬盘
不幸的是,我的查询花费了很多时间来结束。 我能做什么?
最好的问候, 卡梅罗
【问题讨论】:
-
如果
field属性上有skiplist索引,你能检查它是否是稀疏索引吗?您可以通过在 ArangoShell 中运行db.Collection.getIndexes();来查找。如果索引存在且非稀疏,则查询应使用索引进行排序,不需要额外的排序。但是,查询结果仍将包含 1,000,000 个文档,构建此结果集肯定需要一些时间和内存。是否真的需要一次查询一次检索所有 1M 文档? -
我已经尝试过使用稀疏索引。
-
如果索引是稀疏的,它可以不用于这个查询。如果索引是非稀疏的,它可以用来按排序顺序遍历文档,这将消除
SORT步骤,因为排序已经由索引提供。但是,查询仍然会在内存中构建一个巨大的结果,这将花费时间并消耗 RAM。是否有可能将查询结果限制为某些文档,即使用FILTER?否则,您将始终将整个 1M 文档导出给客户,客户可能无法处理该数量。 -
没有稀疏索引它可以工作(索引匹配)。但是如果我想要一个大的结果集,因为我必须批量做一些事情,我该怎么办?
-
如果结果集很大,那么构建它肯定需要时间和内存。为避免这种情况,您可以使用
LIMIT将查询拆分为多个块。例如,第一次迭代:FOR result IN Collection SORT result.field LIMIT 10000 RETURN result。然后离线处理前 10,000 个文档,并记下最后处理的文档的result值。现在再次运行查询,但现在使用额外的过滤器:FOR result IN Collection FILTER result.field > @lastValue LIMIT 10000 RETURN result,直到没有更多文档。如果result.field是唯一的,那应该可以正常工作。
标签: node.js performance arangodb aql nosql