Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js ArangoDB-AQL查询的性能问题_Node.js_Performance_Arangodb_Aql_Nosql - Fatal编程技术网

Node.js ArangoDB-AQL查询的性能问题

Node.js ArangoDB-AQL查询的性能问题,node.js,performance,arangodb,aql,nosql,Node.js,Performance,Arangodb,Aql,Nosql,我通过Strongloop将ArangoDB用于Web应用程序。 运行此查询时,我遇到了一些性能问题: FOR result IN Collection SORT result.field ASC RETURN result 我添加了一些索引来加速查询,比如排序字段上的skiplist索引 我的收藏中有超过100万条记录 该应用程序托管在谷歌云上的n1-highmem-2上。 以下是一些规格: 2个CPU-Xeon E5 2.3Ghz 13 GB内存 10GB固态硬盘 不幸的是,我的查询花

我通过Strongloop将ArangoDB用于Web应用程序。 运行此查询时,我遇到了一些性能问题:

FOR result IN Collection SORT result.field ASC RETURN result
我添加了一些索引来加速查询,比如排序字段上的
skiplist
索引

我的收藏中有超过100万条记录

该应用程序托管在谷歌云上的n1-highmem-2上。 以下是一些规格:

  • 2个CPU-Xeon E5 2.3Ghz
  • 13 GB内存
  • 10GB固态硬盘
不幸的是,我的查询花了很多时间才结束。 我能做什么

致以最良好的祝愿, 卡梅洛总结了上述讨论:


如果
字段
属性上存在skiplist索引,则可将其用于排序。然而,如果它不能。这可以通过运行

db.Collection.getIndexes();
在ArangoShell里。如果索引存在且不是稀疏的,那么查询应该使用该索引进行排序,并且不需要额外的排序-可以重新验证。 然而,查询仍然会在内存中生成一个巨大的结果,这将花费时间和内存

如果需要较大的结果集,
LIMIT
可用于检索多个块中的结果切片,这将减少机器上的压力

例如,第一次迭代:

FOR result IN Collection SORT result.field LIMIT 10000 RETURN result
然后脱机处理这些第一批10000文档,并记下最后处理的文档的结果值。 现在再次运行查询,但现在使用附加筛选器:

FOR result IN Collection
  FILTER result.field > @lastValue LIMIT 10000 RETURN result
直到没有更多的文件。如果
result.field
是唯一的,那么这应该可以正常工作

如果
result.field
不是唯一的,并且skiplist覆盖的集合中没有其他唯一键,则所述方法至少是一种近似方法

还请注意,当将查询拆分为块时,这不会提供快照隔离,但取决于用例,它可能已经足够好了。

总结上述讨论:


如果
字段
属性上存在skiplist索引,则可将其用于排序。然而,如果它不能。这可以通过运行

db.Collection.getIndexes();
在ArangoShell里。如果索引存在且不是稀疏的,那么查询应该使用该索引进行排序,并且不需要额外的排序-可以重新验证。 然而,查询仍然会在内存中生成一个巨大的结果,这将花费时间和内存

如果需要较大的结果集,
LIMIT
可用于检索多个块中的结果切片,这将减少机器上的压力

例如,第一次迭代:

FOR result IN Collection SORT result.field LIMIT 10000 RETURN result
然后脱机处理这些第一批10000文档,并记下最后处理的文档的结果值。 现在再次运行查询,但现在使用附加筛选器:

FOR result IN Collection
  FILTER result.field > @lastValue LIMIT 10000 RETURN result
直到没有更多的文件。如果
result.field
是唯一的,那么这应该可以正常工作

如果
result.field
不是唯一的,并且skiplist覆盖的集合中没有其他唯一键,则所述方法至少是一种近似方法


还请注意,当将查询拆分为块时,这不会提供快照隔离,但取决于用例,它可能已经足够好了。

如果
字段
属性上存在skiplist索引,您可以检查它是否是稀疏索引吗?您可以通过运行
db.Collection.getIndexes()找到答案在ArangoShell中。如果索引存在且不稀疏,则查询应使用该索引进行排序,并且不需要额外的排序。但是,查询结果仍将包含1000000个文档,构建此结果集肯定需要一些时间和内存。实际上,是否需要通过单个查询一次检索所有1M个文档?我已经尝试使用稀疏索引。如果索引是稀疏的,则不能用于此查询。如果索引是非稀疏的,它可以用于按排序顺序迭代文档,这将消除
排序
步骤,因为排序已经由索引提供。然而,查询仍然会在内存中生成一个巨大的结果,这将花费时间和内存。是否有可能将查询结果仅限于某些文档,即使用
过滤器
?否则,您将始终将整个1M文档导出到客户端,客户端可能无法处理该数量,也可能无法处理该数量。如果没有稀疏索引,它将工作(索引匹配)。但是如果我想要一个大的结果集,因为我必须批量做一些事情,我能做什么?如果结果集很大,那么构建它肯定需要时间和内存。为了避免这种情况,您可以使用
LIMIT
将查询分割成块。例如,第一次迭代:
用于集合排序结果中的结果。字段限制10000返回结果
。然后脱机处理前10000个文档,并记录最后一个处理文档的
结果
值。现在再次运行查询,但现在使用一个附加筛选器:
FOR result IN Collection FILTER result.field>@lastValue LIMIT 10000 RETURN result
,直到没有更多文档为止。如果
result.field
是唯一的,这应该可以正常工作。如果
field
属性上存在skiplist索引,您可以检查它是否是稀疏索引吗?您可以通过运行
db.Collection.getIndexes()找到答案在ArangoShell中。如果索引存在且不稀疏,则查询应使用该索引进行排序,并且不需要额外的排序。但是,查询结果仍将包含1000000个文档,构建此结果集肯定需要一些时间和内存。实际上,是否需要通过单个查询一次检索所有1M个文档?我已经尝试使用稀疏索引。如果索引是稀疏的,则不能用于此查询。如果索引是非稀疏的,则可以使用它在