find path执行效率的问题

Nebula 版本:2.6.1版本

我们现在遇到了一种情况。假定有TagA->TagB->TagC,TagA->TagB->TagD->TagC,TagA->TagD->TagC这样的多条路径。我们执行find shortest path from vertexA to vertexC1,vertexC2,vertexC3,vertexC4,vertexC5,vertexC6 over *。其中确实存在点A到点C1,C2,C3的路径。
如果执行不同的语句:
find shortest path from vertexA to vertexC1,vertexC2,vertexC3,vertexC4,vertexC5,vertexC6 over *; 需要130ms
find shortest path from vertexA to vertexC1,vertexC2,vertexC3 over *; 需要5ms
find shortest path from vertexA to vertexC4,vertexC5,vertexC6 over *; 需要3ms
这种情况给我们的接口可用性带来了极大的困扰。具体执行的结果如下图:



这个是节点a所有的连通图

可以把这些语句 分别 执行profile。看一下 哪里的时间消耗有区别

1 个赞


应该是这个,这个才是生产环境的

你先按照 jmq2020 的回复,把语句的 profile 都执行下,看下哪里花了很多时间。


这个是终点有的存在有的不存在的

这个是终点全都不存在的

这个是终点全部都存在的

第一个图 扫描出来的数据也很多,没看出异常, 最后一张,终点全部存在 反而扫描出的数据少了,没看明白

现在就是全部没有或者全部都有,它扫描的行数都会有减少

我把SHORTEST换成NOLOOP和ALL,一样是终点有存在和不存在混合的情况比较慢,执行时间超过100ms

可以测试一下。终点全部存在, 和终点 随便加几个 肯定不存在的。对比一下

尝试了几个,看起来这个语句的执行效率不仅仅与起点能够连到的节点有关,并不是一个简单的广度优先搜索。能够到达终点的连通图的复杂度也会影响这个语句的执行效率。我们这边的场景是使用nebula进行员工是否有某一个权限的判断,在人-角色-权限的路径外加了一条人-邮件组-角色-权限。然后有以下场景:
1、员工通过一个邮件组获得了一个角色和一个权限,这个邮件组关联了公司大部分人(超过两万),执行find all path from 员工 to 权限 over * ,大约用了160ms;
2、还是同样的员工,但权限通过所有路径关联的员工减少到10人以下,查询任意该员工能关联到的权限,都不会超过5ms;
3、还是同样的员工,权限通过所有路径关联的员工也在10人以下,但是这些权限都是该员工不可达的,这些权限任意组合,不会超过5ms;
4、将2,3两步的权限混合组合,执行时间也不超过5ms;
5、还是该员工,权限通过角色关联了400个员工,但该员工与该权限无连通。执行find path最终耗时90ms

find path 算法使用的 是双向BFS 算法, 从 起始点和 终止点 同时拓展的,
你要确定一下,OVER * 情况下 ,即使 员工与权限不连通, 是否还存在其他类型的边

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