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