为什么我的Neo4J文本索引对查询性能没有影响?

fv2wmkja  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(151)

我已经创建了一个简单的neo4j图,并且正在测试沿着属性进行索引的影响,并且正在努力理解为什么似乎正在使用和运行的索引没有提高只读查询性能。

图表和索引创建详情:

有两种类型的节点标签(src_node和tag),每个节点都有一个单独的文本属性,分别是src_prop和tag_str。
我在“tag”节点的tag_str属性上创建了一个简单的索引。
"CREATE TEXT INDEXtag_idxFOR (n:tag) ON (n.tag_str)
我创建了1000个标记节点,每个节点都有一个随机生成的tag_str值,长度为8个字符。
例如CREATE (:tag {tag_str:"A1B2C3D4"})
我创建了100000个源节点,每个源节点都有一个str_prop,它是一个长度为32的随机字符串,每个源节点都链接到一个标记,边标记为“contains”
MATCH (tgt:Tag WHERE tgt.TestString = "A1B2C3D4") CREATE (:src_node{src_prop:<32_char_string>})-[:contains]->(tgt)
这一切都很好,我可以确认链接已创建。

查找查询

例如,我运行一个简单的查询来查找链接到特定标记的节点
MATCH (tgt:tag WHERE tgt.tag_str = "asEQqNLF") - [] - (retnode) return retnode
我可以查看索引统计信息,并验证在运行此查询时是否正在读取它。
当我比较索引和非索引运行时,查找查询(不是src_node创建查询)的索引性能要么相同,要么稍差。我很难理解为什么,所以我很感激人们可能有的任何见解。
例如,我是否创建了不正确的索引类型?我是否在查询的另一个部分(如边遍历)遇到瓶颈?我是否错过了一些配置?

im9ewurl

im9ewurl1#

一些想法:

  1. 1000个索引节点对于性能上的显著差异来说可能是太小的数目,特别是如果所有节点都被高速缓存在存储器中(因为在没有索引的情况下扫描这样小数目的节点无论如何都将非常快)。
    1.通过比较每个操作只执行一次所花费的时间,您无法得出任何有效的结论。您需要多次执行这些操作。
    1.除了使用索引(或不使用索引)之外,您的测试还遍历关系并在另一端返回节点。完成这些额外工作所花费的时间掩盖了(甚至可能淹没了)获取起始节点所花费的时间。
    通过多次执行您希望比较的操作,可以实现更准确的比较。例如(其中$tag_str_list是可能有500个有效tag_str值的parameter):
MATCH (t:tag)
WHERE t.tag_str IN $tag_str_list
RETURN COUNT(*) AS cnt

相关问题