我在" customUrl"上完成了节点自动索引。属性。但是当我使用索引运行我的查询而没有索引时,我感到惊讶的是,如果没有索引,它与索引相比花费的时间更少。
以下是带索引的查询。
PROFILE Start u = node:node_auto_index("customUrl:vishal") Match (u : User) return u
正如您所看到的那样花了677毫秒。
以下是没有索引的查询。
PROFILE Match (u : User {customUrl : 'vishal'}) return u
没有索引和更多数据库命中的此查询仍然花费更少的时间。我已经读过neo4j缓存响应,并在后续调用中返回缓存的响应,但不幸的是我没有看到后续调用的响应时间有任何降低。我是否必须明确启用缓存?
答案 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堆大小(除非您明确配置其大小)。