ArangoDB中的社交网络ish查询
我的数据库具有以下“架构”:ArangoDB中的社交网络ish查询,arangodb,Arangodb,我的数据库具有以下“架构”: 用户作者帖子 用户喜欢帖子 我的测试数据库包含: 162个用户 442个员额 159喜欢 现在我想查询最受欢迎的用户,这些用户在他们所有的帖子中收集了最喜欢的内容。我提出了以下问题: FOR u IN users LET nblikes = SUM(FOR post IN 1 OUTBOUND u isAuthor RETURN LENGTH(GRAPH_EDGES('my-graph', post, { edgeCollection
- 用户作者帖子
- 用户喜欢帖子
- 162个用户
- 442个员额
- 159喜欢
FOR u IN users
LET nblikes = SUM(FOR post IN 1 OUTBOUND u isAuthor
RETURN LENGTH(GRAPH_EDGES('my-graph', post, { edgeCollectionRestriction: 'likes' })))
SORT nblikes DESC
RETURN {
"username": u.username,
"nblikes": nblikes
}
它在2014年年中的MacBookPro(2.8GHz Core i7,16GB RAM)上以大约0.8秒的速度执行。0.8s并不丢脸,但在这么小的数据集上,我本以为会更好,因为这一切都发生在内存中
因此,如果有一些ArangoDB专家能够回顾我的查询并提示一些潜在的性能问题,我将不胜感激。非常感谢 有几种方法可以加快此查询的运行速度 最大的改进是用另一次深度1遍历来替换对
GRAPH_EDGES
的内部调用,以找到“likers”,如下所示:
FOR u IN users
LET nblikes = SUM(
FOR post IN 1 OUTBOUND u isAuthor
RETURN LENGTH(
/* the following traversal replaces the call to GRAPH_EDGES */
FOR liker IN 1 INBOUND post._id likes
RETURN 1
)
)
SORT nblikes DESC
RETURN {
username: u.username,
nblikes: nblikes
}
对GRAPH\u EDGES
的内部函数调用非常昂贵,去掉它将大大提高查询执行时间
另一种变体是(现在)将两个遍历替换为普通连接,如下所示:
FOR u IN users
LET nblikes = SUM(
/* the following join between users, isAuthor and likes
replaces the traversal & GRAPH_EDGES calls */
FOR a IN isAuthor
FILTER a._from == u._id
FOR l IN likes
FILTER l._to == a._to
RETURN 1
)
SORT nblikes DESC
RETURN {
username: u.username,
nblikes: nblikes
}
这两种变体都应该比初始查询更快,主要是因为
GRAPH\u EDGES
在循环中调用代价高昂。由于它是一个无状态AQL函数,因此需要重复设置其上下文(从内部循环调用的频率相同)。遍历和连接解决方案可以在调用之间保留更多的上下文,因此它们“更便宜”。如果使用建议的图遍历,查询的速度有多快,使用连接的速度有多快?谢谢您可以将GRAPH\u EDGES
用作顶级构造,而不是在循环中使用。如果您想将其与限制
结合使用,则它有一个明确的计数器指示器-这没有意义。