match带where查询效率问题

1)match(m:台区电量08日明细) where id(m)==‘1001020230802distStatDay’ return m 很快
2)match(m:台区电量08日明细) where id(m) contains ‘20230802’ return m 很慢
3)match(m:台区电量08日明细) where m.台区电量08日明细.日期==‘20230802’ return m 很慢
环境简介:

  1. 资源充足;
  2. 台区电量08日明细, 这个tag下有180万数据,日期是索引;

查询目标:
想要查询20230802这一天的所有数据,用第二条、第三条语句查询都很慢,用第一条查单个索引下的数据很快,想问下如何才能快速查出20230802这一天的数据。

把这几条语句的各自的执行计划贴一下,参考这个的 profile:EXPLAIN和PROFILE - NebulaGraph Database 手册

1 个赞

按属性过滤的查询性能是不可能跟指定 ID 的查询性能一样的,你的第一条查询有明确的 ID,这种是最快的,后两条无论如何也是不可能优化到跟第一条一样快的。首先这个预期要有。

其次,你的后两条都是全图扫点了,只带了一个过滤条件,这种查询的性能一般都是相对最慢的。这个预期也要有。

那么紧接着你可能需要明确一下,你所谓的“很慢”是多慢,你想提高多少,或者这条语句的性能有多重要。如果特别重要,你甚至可能需要变更建模的方式。

现在后两条语句查询要20s左右,想要提升到2s左右。
目前我这边语句大部分都是按照这种方式写的,数据量一万一下情况1-2s就能查出结果,数据量达到百万级别就需要20s左右的时间。

请教下变更建模的方式是什么意思?

第三条语句可以试着改成直接查找带有该日期的点。match(m:台区电量08日明细{日期:‘20230802’} ) return m

图建模 - NebulaGraph Database 手册 可先看下文档介绍

match(m:台区电量08日明细{日期:‘20230802’} ) return m

这种方式和带where查询是一个逻辑吧

把日期作为一个点,然后所有的查询转成图的一度邻居查询

你还有其他查询吗?如果只是根据属性上的日期找点,这种场景的话,用图数据库我觉得不一定是最佳选择

可以使用 LOOKUP 查询

LOOKUP ON 台区电量08日明细
WHERE 台区电量08日明细.日期=='20230802'
YIELD vertex as m

试了下这种查询方法查询时间也很长 :joy:

是根据这个tag的索引(日期)来查询的,看查询计划要扫描该tag下整个索引,所以费时间,不知道有没有其他思路能避免全局扫描

执行计划在内网里面,不太好导出来,看执行计划主要的问题是加了where判断之后,对索引(日期)进行了全局扫描,所以消耗的时间比较多

我的意思是,把日期作为一个点类型

你的查询就变成了 match (v1:日期)–>(v2:台区电量08日明细) where id(v)==‘20230802’ return v2

2 个赞

这是个好思路,需要我们重新写数据,我们先试下看看

我这边用 LOOKUP 这么查千万级别的数据也在100ms左右,但是我的数据属性是 int64 类型,所以可能和数据类型有关。不知道你的 schema 是什么样的,不知道改成 fixed_string 类型会不会有帮助。

我们这边有30多个属性,都是string类型的。你们的索引是int64类型的吗?