match多重查询的性能优化

服务器96核,384个线程,
内存1.5T
运行情况:程序运行时开启了300个线程,内存占用只有25%,线程较多时间处于空闲,总CPU占用较多时候在10%左右
运行命令:

match (v: `player`) where id(v) in range(1, 524288) match (v)-->(v2:team) with v,count(v2) as cnt where cnt==3 match (v)-[e:follow]->(v2) return e

为了解决的问题:查询图库中所有服务三个球队的球员,但球员编号分布的范围较广,大概是1到2的38次方,所以上面的代码会运行524288次
目标:提高资源利用,以及清楚为什么资源利用率这么差

为啥需要运行那么多次,

MATCH (v1:player)-[e]->(v2:team) WITH v1 as v, count(e) as count WHERE count == 3 RETURN v

感觉这个语句就可以,找出出度为 3 的点,返回出来。

因为524288是2的19次方,而我要找的范围是1到2的38次方,所以还需要2的19次方次

所以,我可以理解为,有些球员的编号 vid 是大于 524288,这样么?

是这样的,有些球员的编号可能是2的38次方这么大

MATCH (v1:player)-[e]->(v2:team) WITH v1 as v, count(e) as count WHERE count == 3 AND id(v) in range(1, 524288) RETURN v

:thinking: 这个语句呢?你试试可以不,感觉运行那么多次是不明智的。

1 个赞

哈哈,但是我想获得图库中所有的点啊,我总不能直接给定一个超级大的范围吧 :joy:

我可以理解为,你的 range 的值不定么?上面那个语句是会返回所有满足出度为 3 的点的。

我试了一下您的语句,感觉不太行,本来一个一次好像需要几秒钟,现在直接查询不出来了,现在还在运行 :sweat_smile:

可以试试下面这个:
MATCH (v1:player)-[e:follow]->(v2:team) where id(v1) < 274877906944 with distinct v1, count(v2) as count where count == 3 return v1

274877906944是2的38次方
如果你用19次方就用524288

另外,这个cpu消耗是不会很多。

1 个赞

这种方式也不太行,消耗时间太长了,会有timeout的显示

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。