Neo4j/Cypher简单查询索引扫描不';行不通
我有一个简单的节点Neo4j/Cypher简单查询索引扫描不';行不通,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有一个简单的节点User,它具有UserId属性,该属性具有唯一的约束设置 我开始分析我的查询,并注意到每次我通过UserIdNodeByLabelScan而不是NodeUniqueIndexSeek对User节点执行匹配时 我试过下面最简单的匹配 match(u:User{UserId:“id”})返回u,索引扫描不起作用 如果我显式地指定索引,一切正常 match(u:User{UserId:“id”})使用索引u:User(UserId)返回u 任何人都可以澄清为什么会发生这种情况。Cy
User
,它具有UserId
属性,该属性具有唯一的约束设置
我开始分析我的查询,并注意到每次我通过UserId
NodeByLabelScan而不是NodeUniqueIndexSeek对User
节点执行匹配时
我试过下面最简单的匹配
match(u:User{UserId:“id”})返回u
,索引扫描不起作用
如果我显式地指定索引,一切正常
match(u:User{UserId:“id”})使用索引u:User(UserId)返回u
任何人都可以澄清为什么会发生这种情况。Cypher将默认使用
NodeUniqueIndexSeek
,如果您有一定数量的相同标签的节点,在2.2.5版本中,如果我记得的话,它是从703个节点开始触发的
在这个树状结构下面,使用索引或标签索引不会提高查询的性能。您有多少个用户节点?可能是基于成本的查询规划器认为/知道只有很少的标记节点,因此使用索引没有任何好处。您可以尝试使用基于规则的规划器(将CYPHER planner=规则前置到CYPHER查询)吗?在我的例子中,对于90k+节点,尽管我有唯一的约束,neo4j使用nodebylabelscan并使用属性进行筛选。这反过来又增加了很多时间。如何摆脱LabelScan最好的方法是共享您的查询计划,neo4j默认情况下每个模式只使用一个索引,您可以强制使用索引