MATCH语句多条件过滤的查询性能

  • nebula 版本:nebula-graph-3.6.0

  • 部署方式:分布式

  • 安装方式:DEB

  • 是否上生产环境:Y

  • 硬件信息

    • 三台物理机
    • 磁盘:每台6块SSD固态硬盘
    • CPU:48核96线程
    • 内存:1T
  • 数据量

    • 点:222,684,324
    • 边:1,318,058,307
  • 查询语句

    MATCH (a:accountStatistics)-[:MAX_BALANCE_ADDR]-(b) WHERE a.accountStatistics.from_addr_count > 1 AND a.accountStatistics.from_addr_count < 30 RETURN id(a) as startId,id(b) as endId LIMIT 50;
    

    这个语句中,tag:accountStatistics的from_addr_count 添加了索引,edge:MAX_BALANCE_ADDR添加了索引,执行耗时:458.884382s

  • 执行计划

    执行计划.csv (6.7 KB)

  • 问题

  1. 我们类似的查询语句还有很多,通过边的关系以及点的某些属性进行查询,类似这样的查询是否有相应的优化方案
  2. 在执行完查询语句后,内存(实际使用内存)不会进行释放,再执行其它语句时就变得特别慢,再执行同一条查询语句,也会变慢,甚至超时

这个语句索引已经命中了,但是数据量太大了。所以…性能不大好。

你可以试试去掉索引,看看查询是不是会快一点。

如果去掉索引,我怎么通过条件过滤呢

因为你后面有个 limit 50,看下你去掉索引之后,limit 是不是下推成功,可能会提高速度。

我要查的是from_addr_count 这个属性在1-30的范围内随机取50条,如果去掉索引的话,match语句语法不通过吧

去掉索引不代表你的筛选条件不成立啊,随机捞 50 条满足你条件的数据返回(limit 如果下推的话)也许比你现在走索引会更快点。


我的意思是这个,不是 MATCH如果属性作为条件,必须有索引吗

不是的,match 没有索引的话,就是捞所有数据而已。

MATCH 的 LIMIT 是所有前置查询都结束之后再进行的截断,所以对性能没有什么帮助

对于这种情况,建议试试

LOOKUP on accountStatistics
WHERE accountStatistics.from_addr_count > 1
AND accountStatistics.from_addr_count < 30
YIELD id(vertex) as startId | LIMIT 50 |
GO FROM $-.startId OVER MAX_BALANCE_ADDR BIDRECT
YIELD src(edge) as startId, dst(edge) as endId | LIMIT 50

这种查询是先对起始点进行截断,然后对起始点进行边的查询,再对结果进行截断。但这种查询可能会因为起始点关联的边数量不够50,所以还需要再进行若干次补充查询。

另外最后结果因为边的双向查询,所以 startId 和 endId 是相反的结果。

1 个赞

但是他数据量大的情况下,感觉这个情况不会出现的样子。就是,感觉你这个语句是可行的。

可是我去掉索引之后,执行语句就报错了呀

那就是 limit 没下推,然后得索引才能查询。你试试 ianhe 说的方法。

我刚试了,可以的. :ok_hand:

1 个赞

耗时多少啦

最后结果需要注意双向边的问题,如果 accountStatistics 是终点,那么 endId 才是最初你的 match 查询里的 a,如果 accountStatistics 是起点就没关系了。

所以可以改成

LOOKUP on accountStatistics
WHERE accountStatistics.from_addr_count > 1
AND accountStatistics.from_addr_count < 30
YIELD id(vertex) as startId | LIMIT 50 |
GO FROM $-.startId OVER MAX_BALANCE_ADDR BIDRECT
YIELD $^ as start, $$ as end | LIMIT 50

然后判断一下 start 和 end 的类型就行

1 个赞

0.244935 s

1 个赞

这个速度优秀啊,直接变成原来的万分之五啦。

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