Neo4j使用非唯一索引与使用唯一约束相比运行速度非常慢

时间:2018-02-14 16:51:33

标签: performance neo4j windows-10

在Windows 10 64位上使用Neo4j 3.3.2。 在数据库中的节点上运行简单查询,总共有大约250,000个节点。

UNWIND {LIST} AS i MATCH (ig:Ingrd {name: i.NAME}) SET ig.cas = i.CAS 

如果我在最初加载节点之前创建以下索引,并且在运行上述查询之前它运行缓慢:

CREATE INDEX ON :Ingrd(name)

如果我删除该索引并运行以下命令,它会快速运行:

CREATE CONSTRAINT ON (ig:Ingrd) ASSERT ig.name IS UNIQUE

使用INDEX,查询运行大约15个事务/秒

使用CREATE CONSTRAINT,查询运行大约7000个事务/秒

如果我描述,唯一的区别是' NodeIndexSeek'与' NodeUniqueIndexSeek'。

为什么它运行速度慢400倍?

提前致谢。

更新:添加了图片。一切看起来应该没问题,但是当运行时向列表中添加1000个更新来展开时,唯一约束的速度提高了400倍。

enter image description here

enter image description here

Update2 :在一个线程中运行,如果背靠背多次运行,则可以重现。上面编辑的实际查询。上述索引/约束是此节点的唯一索引/约束。对于此节点(Ingrd),名称字段实际上是唯一的,因此添加约束可以解决此特定问题,但对于其他节点仍然存在。可以使用非唯一搜索字段为其他节点重现。

1 个答案:

答案 0 :(得分:0)

性能问题似乎与UNWIND有关。如果我在批处理事务中运行事务并使用参数,则它可以使用非唯一索引。

UNWIND {LIST} AS i MATCH (ig:Ingrd {name: i.NAME}) SET ig.cas = i.CAS 

很慢。

MATCH (ig:Ingrd {name: {NAME}}) SET ig.cas = {CAS)

很快。

我转而使用UNWIND来尝试提高性能。这不适用于非唯一索引。使用UNWIND的速度要慢100倍。