Cypher在匹配的百万用户上的性能



我使用的是redisgraph,查询很简单。如何更快地获得这样的国家列表?

> GRAPH.profile g "MATCH (u:user) return collect(distinct u.countryCode) as codes" 
1) "Results | Records produced: 1, Execution time: 0.001353 ms"
2) "    Aggregate | Records produced: 1, Execution time: 238.989679 ms"
3) "        Node By Label Scan | (u:user) | Records produced: 833935, Execution time: 81.158457 ms"

以下是您的查询正在执行的操作:

  1. 查找图中的每个用户节点。如果对这些节点进行索引,则速度会更快,但索引查找总是比图遍历慢。您在81毫秒内完成了833935次索引查找
  2. 在每个节点上查找每个国家/地区代码。属性检索也需要时间,但这里的大部分时间都是删除重复的记录。只有180个左右的国家,所以其中大约83.3万个用户节点没有对你的最终结果做出贡献。这花了239毫秒
  3. 返回结果:超级快

我看不出有什么好方法可以加快速度,因为图形是按原样设计的。不过,请确保用户节点和countryCode都有索引。您可以考虑将Country拆分为自己的节点类型,然后只匹配(c:Country(。然而,您会面临创建密集节点的风险,因为例如,美国的用户可能比阿尔巴尼亚多。

如果你经常需要一个国家代码列表,而你无法更改图表,那么你可以考虑更棘手的事情,比如在:用户节点中添加一个:FirstInCountry标签,或者为唯一的国家代码用户集设置10000-10180这样的节点ID。

编辑:原来我说错了。最初的:用户查找是基于标签存储的,所以那里的索引是不相关的。

最新更新