查询简单语句特别慢,有时候会超时,有时候graphd直接挂掉,请问是怎么回事

前置数据背景:目前数据有大概 2亿个点,3亿个边

问题描述:进行简单的gql检索 速度极慢
例如:
LOOKUP ON algorithm_cc where algorithm_cc.cc==“5012384489” YIELD properties(vertex).id
会直接超时,并且执行该条语句时,studio其他页面什么都操作不了。其中algorithm_cc.id 是索引
试过其他的简单gql 也是这个情况,例如:match (n:algorithm_cc) where n.id ==“xxx” return n;

出现过的几个报错:
(1):GraphMemoryExceeded
(2):RPC timeout

除去几个通用的目前我的几个关键配置:

graphd:

这个参数没有改之前,查询语句会报内存超过水位 然后被kill掉
# System memory high watermark ratio, cancel the memory checking when the ratio greater than 1.0
--system_memory_high_watermark_ratio=0.9
# storage client timeout
--storage_client_timeout_ms=180000

storaged:

--enable_partitioned_index_filter=true

  • nebula 版本:3.4.0
  • 部署方式:分布式 (1台metad 3台graphd 3台storaged)
  • 安装方式:RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD) 3台机器都是500G
    • CPU、内存信息。 3台机器都是16C 64G
  • 问题的具体描述
  • 相关的 meta / storage / graph info 日志信息(尽量使用文本形式方便检索)

求助各位大佬是什么问题?
索引rebuild过了,节点BALANCE LEADER过了,SUBMIT JOB COMPACT也执行完成了
主要是特别简单的语句,查询速度特别慢,论坛都翻了个遍了,没有什么好的解决方法

补充一下,Partition Number 设置的是100

分享一下查询的文本的 profile 结果?比如

profile LOOKUP ON algorithm_cc where algorithm_cc.cc==“5012384489” YIELD properties(vertex).id

另外,返回的 id 不是 vid 么?是的话可以 YIELD id(vertex)

再就是 match (n:algorithm_cc) where n.id ==“xxx” return n; 是错误的表达应该是 n.algorithm_cc.id =="xxx"

此外,如果 id 是唯一的,建议直接作为 vid,则查询为 WHERE id(n) == "xxx",这时候这个查询是非常高效的。

1 个赞

n.algorithm_cc.id ==“xxx” 这个语句可以,速度很快,感谢

关于这个语句

LOOKUP ON algorithm_cc where algorithm_cc.cc=="5012384489" YIELD properties(vertex).id

profile会超时,explain的结果是这样的

对于上方的这个语句 其实已经是带了where之后的语句 并且id只是其中一个需要的数据。 真实的想执行的语句是:

LOOKUP ON algorithm_cc YIELD properties(vertex).id,properties(vertex).cc,properties(vertex).type

他的执行计划是:

这个是开发小伙伴想将这些数据查询出来,然后导入到其他的数据库

从执行计划看,index_full_scan,说明索引没有命中,你应该有一个 algorithm_cc 的 cc 属性的索引(或者复合索引的第一个属性是 cc),才会命中,参考我的文章和里边搜索另一篇关于索引的文章。

1 个赞