【问题标题】:Neo4j/Cypher simple query index scan doesn't workNeo4j/Cypher 简单查询索引扫描不起作用
【发布时间】:2016-01-26 16:14:49
【问题描述】:

我有一个简单的节点 User,它具有 UserId 属性,该属性具有唯一的约束设置。

我开始分析我的查询,并注意到每次我对 User 节点执行匹配时,都会执行 UserId NodeByLabelScan 而不是 NodeUniqueIndexSeek。

我在下面尝试了最简单的匹配。

match (u:User {UserId:"id"}) return u 和索引扫描不起作用。

如果我明确指定索引,一切正常。

match (u:User {UserId:"id"}) using index u:User(UserId) return u

谁能解释一下为什么会这样。

【问题讨论】:

  • 你有多少个用户节点?可能是基于成本的查询计划器认为/知道只有很少的标记节点,因此使用索引没有好处。您可以尝试使用基于规则的规划器(将 CYPHER planner=rule 添加到 Cypher 查询中)吗?

标签: neo4j cypher graph-databases


【解决方案1】:

如果你有一定数量的相同标签的节点,Cypher 默认使用NodeUniqueIndexSeek,如果我记得的话,在 2.2.5 版本中它是从 703 个节点开始触发的。

低于此阈值,使用索引或标签索引的查询不会提高性能。

【讨论】:

  • 在我的情况下,对于 90k+ 个节点,虽然我有唯一约束,但 neo4j 使用 nodebylabelscan 并使用属性进行过滤。这反过来又增加了很多时间。我怎样才能摆脱标签扫描
  • 最好是分享你的查询计划,neo4j默认每个模式只使用一个索引,你可以强制索引
猜你喜欢
  • 2013-09-18
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多