Spring Neo4j:通过不同控制台执行时相同的密码查询花费不同的时间

2024-04-22

通过不同控制台执行相同的密码查询会花费不同的时间:

通过执行spring-data-neo4j:(花了 8 秒)

@Query(
"MATCH (user:User {uid:{0}})-[:FRIEND]-(friend:User)" +
"RETURN friend"
)
public List<User> getFriends(String userId);

通过执行http://localhost:7474/browser/:(花了 250 毫秒)

通过执行http://localhost:7474/webadmin/#/console/:(花了 18 毫秒)

尽管通过控制台执行的查询非常快并且花费的时间在可接受的范围内,但对于生产来说,我必须从我的 java 应用程序执行这些查询,在这种情况下,查询所花费的时间是完全不可接受的。

Edit:

@NodeEntity
public class User extends AbstractEntity {

    @RelatedToVia(elementClass = Friendship.class, type = FRIEND, direction = BOTH)
    private Set<Friendship>     friendships;

    ...
}

确保在进行基准测试时至少运行测试 3 次并计划放弃第一个测试。我发现对于任何给定的查询,需要运行一两次来预热 Neo4j 的缓存。这与大多数 RDBMS 不同,大多数 RDBMS 不以相同的方式进行缓存。

我的做法是运行测试查询 5 次并删除前 2 次。无论数据集的大小(我使用数万和数十万个节点进行测试)和脚本的复杂性(我有一些运行超过 50 行左右的 Cypher 语句、多个WITH 等)。我发现,在前两次运行之后,同一查询的一次运行到下一次运行的性能往往保持在相同的值附近。

因此,请确保在生产中您已为常见查询预热了缓存。并确保您有足够的内存可供 JVM 和 Neo4j 使用。大多数数据集都小于几 GB,因此如果 Neo4j 能够访问足够的内存,则可以放入内存中。

最后,确保索引就位(例如 CREATE INDEX ON :User(uid))。将大部分图形及其属性加载到内存中,并设置正确的索引后,Neo4j 应该能够真正执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Neo4j:通过不同控制台执行时相同的密码查询花费不同的时间 的相关文章

随机推荐