ArangoDB - AQL 查询的性能问题
ArangoDB - Performance issue with AQL query
我正在通过 Strongloop 将 ArangoDB 用于 Web 应用程序。
当我 运行 这个查询时,我遇到了一些性能问题:
FOR result IN Collection SORT result.field ASC RETURN result
我添加了一些索引来加快查询速度,例如 skiplist
排序字段上的索引。
我的Collection里面有超过1M的记录.
该应用程序托管在 n1-highmem-2 上 Google 云端。
低于一些规格:
- 2 个 CPU - 至强 E5 2.3Ghz
- 13 GB 内存
- 10GB 固态硬盘
不幸的是,我的查询花了很多时间才结束。
我能做什么?
此致,
卡梅隆
总结以上讨论:
如果 field
属性上存在跳过列表索引,则可以将其用于排序。但是,如果它 created sparse 它不能。这可以通过 运行ning
重新验证
db.Collection.getIndexes();
在 ArangoShell 中。如果索引存在且非稀疏,则查询应使用索引进行排序并且不需要额外的排序 - 这可以重新验证 using Explain。
但是,查询仍会在内存中生成巨大的结果,这会花费时间并消耗 RAM。
如果需要一个大的结果集,LIMIT
可以用于在几个块中检索结果的切片,这将减少对机器的压力。
例如,第一次迭代:
FOR result IN Collection SORT result.field LIMIT 10000 RETURN result
然后离线处理这前10,000个文档,记下最后处理文档的结果值。
现在再次 运行 查询,但现在有一个额外的 FILTER:
FOR result IN Collection
FILTER result.field > @lastValue LIMIT 10000 RETURN result
直到没有更多文件。如果 result.field
是唯一的,那应该可以正常工作。
如果 result.field
不是唯一的,并且在跳过列表涵盖的集合中没有其他唯一键,那么所描述的方法将至少是一个近似值。
另请注意,将查询拆分为块时,这不会提供快照隔离,但根据用例,它可能已经足够好了。
我正在通过 Strongloop 将 ArangoDB 用于 Web 应用程序。 当我 运行 这个查询时,我遇到了一些性能问题:
FOR result IN Collection SORT result.field ASC RETURN result
我添加了一些索引来加快查询速度,例如 skiplist
排序字段上的索引。
我的Collection里面有超过1M的记录.
该应用程序托管在 n1-highmem-2 上 Google 云端。 低于一些规格:
- 2 个 CPU - 至强 E5 2.3Ghz
- 13 GB 内存
- 10GB 固态硬盘
不幸的是,我的查询花了很多时间才结束。 我能做什么?
此致, 卡梅隆
总结以上讨论:
如果 field
属性上存在跳过列表索引,则可以将其用于排序。但是,如果它 created sparse 它不能。这可以通过 运行ning
db.Collection.getIndexes();
在 ArangoShell 中。如果索引存在且非稀疏,则查询应使用索引进行排序并且不需要额外的排序 - 这可以重新验证 using Explain。 但是,查询仍会在内存中生成巨大的结果,这会花费时间并消耗 RAM。
如果需要一个大的结果集,LIMIT
可以用于在几个块中检索结果的切片,这将减少对机器的压力。
例如,第一次迭代:
FOR result IN Collection SORT result.field LIMIT 10000 RETURN result
然后离线处理这前10,000个文档,记下最后处理文档的结果值。 现在再次 运行 查询,但现在有一个额外的 FILTER:
FOR result IN Collection
FILTER result.field > @lastValue LIMIT 10000 RETURN result
直到没有更多文件。如果 result.field
是唯一的,那应该可以正常工作。
如果 result.field
不是唯一的,并且在跳过列表涵盖的集合中没有其他唯一键,那么所描述的方法将至少是一个近似值。
另请注意,将查询拆分为块时,这不会提供快照隔离,但根据用例,它可能已经足够好了。