与neo4j中的更多db命中相比,为什么更少的db命中仍然需要更多的时间来返回响应?

时间:2016-03-02 07:27:27

标签: neo4j cypher

我在" customUrl"上完成了节点自动索引。属性。但是当我使用索引运行我的查询而没有索引时,我感到惊讶的是,如果没有索引,它与索引相比花费的时间更少。

以下是带索引的查询。

PROFILE Start u = node:node_auto_index("customUrl:vishal") Match (u : User) return u

enter image description here

正如您所看到的那样花了677毫秒。

以下是没有索引的查询。

PROFILE Match (u : User {customUrl : 'vishal'}) return u

enter image description here 没有索引和更多数据库命中的此查询仍然花费更少的时间。我已经读过neo4j缓存响应,并在后续调用中返回缓存的响应,但不幸的是我没有看到后续调用的响应时间有任何降低。我是否必须明确启用缓存?

1 个答案:

答案 0 :(得分:3)

前一个语句对lucene执行完整的索引查询。后者只扫描给定标签的所有节点(~200)并对其应用过滤器。

标签扫描应使用O(n)进行缩放,而索引操作应使用O(log(n))进行缩放。因此,您拥有的数据越多,使用索引的好处就越大。

查询手动/自动索引时,您必须区分简单索引查找和完整索引查询:

 START u = node:node_auto_index(customUrl = "vishal") RETURN u // seek
 START u = node:node_auto_index("customUrl:vishal") RETURN u // query

有关http://neo4j.com/docs/stable/query-start.html的RTFM详情。搜索应该比查询更快。

Neo4j 从不缓存查询响应,而是在page cache中缓存节点,关系和属性。默认情况下启用此缓存,最多可占用RAM的50%减去最大Java堆大小(除非您明确配置其大小)。