代码之家  ›  专栏  ›  技术社区  ›  I.F. Adams

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

  •  0
  • I.F. Adams  · 技术社区  · 2 年前

    我已经创建了一个简单的neo4j图,并正在测试沿属性进行索引的影响,我很难理解为什么该索引(看起来已经使用并运行)没有提高只读查询性能。

    图表和索引创建详细信息:

    有两种类型的节点标签(src_node和tag),每个节点都有一个单独的文本属性,分别是src_prop和tag_str。

    我在“tag”节点上的tag_str属性上创建了一个简单的索引。

    "CREATE TEXT INDEX `tag_idx` FOR (n:`tag`) ON (n.`tag_str`)

    我创建了1000个标签节点,每个节点都有一个随机生成的8个字符长的tag_str值。

    例如 CREATE (:tag {tag_str:"A1B2C3D4"})

    我创建100000个源节点,每个节点都有一个长度为32的随机字符串str_prop, 每个标签都链接到一个标签,边缘标记为“包含”

    MATCH (tgt:tag WHERE tgt.tag_str= "A1B2C3D4") CREATE (:src_node{src_prop:<32_char_string>})-[:contains]->(tgt)

    这一切都很好,我可以确认链接已经创建。

    查找查询

    例如,我运行一个简单的查询来查找链接到特定标记的节点

    MATCH (tgt:tag WHERE tgt.tag_str = "asEQqNLF") - [] - (retnode) return retnode

    我可以查看索引统计信息,并验证在运行此查询时是否正在读取它。

    当我比较索引运行与非索引运行时,查找查询(而不是src_node创建查询)的索引性能要么相同,要么稍差。我很难理解为什么,所以我很感激大家能有任何见解。

    例如,我是否创建了不正确类型的索引?我是否在查询的另一部分(如边缘遍历)遇到了瓶颈?有没有我错过的配置?

    澄清更新

    定时测试运行次数超过10万次,包括每次事务时间以及有索引和无索引的端到端定时。我也缩放了图表的大小,看到了类似的结果,但将根据下面的反馈继续调查。

    修正了这里帖子中存在的一个小拼写错误,但 在我参考的实际测试中。

    1 回复  |  直到 2 年前
        1
  •  1
  •   cybersam    2 年前

    一些想法:

    1. 对于性能的显著差异来说,1000个索引节点可能太小了,尤其是如果所有节点都缓存在内存中(因为在没有索引的情况下扫描如此少量的节点无论如何都会非常快)。

    2. 通过比较仅执行一次每个操作所需的时间,您无法得出任何有效的结论。您需要执行大量的操作。

    3. 除了使用索引(或不使用),测试还遍历关系并返回另一端的节点。做额外工作的时间会使获得起始节点所需的时间变得模糊(可能会淹没)。

    只需多次执行您希望进行比较的操作,即可实现更准确的比较。例如(其中 $tag_str_list parameter 可能有500个有效 tag_str 值):

    MATCH (t:tag)
    WHERE t.tag_str IN $tag_str_list
    RETURN COUNT(*) AS cnt