如何提升nebula计算两个点之间的关联边数量的性能?

  • nebula 版本:2.6.1
  • 部署方式:分布式
  • 安装方式:源码编译
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘 1.5T
    • CPU、内存信息 32C128G
    • 查询客户端的配置为 4C8G
  • 问题的具体描述

测试逻辑
查询指定的两个点之间的明细边关系数量

查询语句
MATCH (v)-[e:useridtodeviceid1]-(v2)
where id(v) == '1588’
and id(v2) == '411
*********08E’
RETURN count(e);

测试结果:
边关系数据量3W
平均响应时间在2.6秒, 95线 3.5秒 QPS:40 客户端服务的CPU 利用率20%
nebula机器的cpu占25%左右

边关系数据量1K
平均响应时间在111毫秒, 95线 144毫秒 QPS: 950 客户端服务的cpu利用率30%
nebula机器的cpu占23%左右

边关系数据量300
平均响应时间在38毫秒, 95线 49毫秒 QPS: 2780,客户端服务的cpu利用率 60% nebula的cpu占30%左右

边关系数据量2
平均响应时间在17毫秒, 95线 22毫秒 QPS 达到5300 客户端服务的cpu利用率达到100%
nebula的cpu占20%左右

服务的响应速度和吞吐量随着明细边数量的增加而下降,边数量达到1千以上时平均响应时间突破100ms。边为个位数时,平均响应时间十几毫秒。并且数量的统计没办法做到超过多少个直接返回。

问题:
如何提升这样统计数据的查询效率?

你可以在你的执行语句前面加一个 PROFILE 吗,看下执行计划。

这个是执行计划

可以升级版本,我们对match的执行做了许多优化,并且还在持续优化中

1 个赞

2.6.1版本也可以考虑用go重写下

升级版本的话对这个查询的效率能提升多少呀?

也可GO改写,GO的语意比较简单执行性能在这个版本应该高很多
go from 'abc' over like where like._dst == 'def' yield like._src AS src | group by $-.src yield count ($-.src)

GO改写后性能确实得到了很大的提升,不过还是达不到我们的需求,有办法统计数量超过多少时就不继续扫描数量提升性能么

加上limit 子句?

可以了,通过限制查询的结果数提升了统计数度,这样也是可以接受的

1 个赞

如果你觉得上面 Shylock-Hg 的回复解决了你的问题,可以勾选为解决方案哈

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