我有一个具有以下属性的Neo4J数据库:
有12M节点和125M关系.
所以你可以说这是一个非常大的数据库.
我的操作系统是Windows 10 64位,在Intel i7-4500U CPU @ 1.80Ghz上运行,内存为8GB.这不是一个完整的强大,但它是一个不错的机器,理论上,总存储甚至可以适合RAM.
但是,当我运行一个非常简单的查询(使用Neo4j浏览器)时
MATCH (n {title:"A clockwork orange"}) RETURN n;
Run Code Online (Sandbox Code Playgroud)
我得到一个结果:
Returned 1 row in 17445 ms.
Run Code Online (Sandbox Code Playgroud)
我还使用了对http:// localhost:7474/db/data / cypher 进行相同查询的post请求,这需要19秒.
像这样的东西: http:// localhost:7474/db/data/node/15000 然而在23ms执行...
我可以确认标题上有一个索引:
Indexes
ON :Page(title) ONLINE
Run Code Online (Sandbox Code Playgroud)
所以任何人都有关于为什么这么慢可能运行的想法?
谢谢!
这必须扫描数据库中的所有节点 - 如果使用n:Page而不是n重新运行查询,它将使用这些节点上的索引,您将获得更好的结果.
要进一步扩展它 - INDEX ON:页面(标题)仅适用于具有:Page标签的节点,并且为了利用该索引,您的MATCH()需要在其搜索中指定该标签.
如果指定的MATCH()没有标签,则查询引擎没有"线索"您正在查找的内容,因此必须执行完整的数据库扫描才能找到具有title属性的所有节点并检查其值.
这就是为什么
MATCH (n {title:"A clockwork orange"}) RETURN n;
Run Code Online (Sandbox Code Playgroud)
花了这么长时间 - 它必须扫描整个数据库.
如果你告诉MATCH()你正在寻找一个带有:Page标签和title属性的节点-
MATCH (n:Page {title:"A clockwork orange"}) RETURN n;
Run Code Online (Sandbox Code Playgroud)
查询引擎知道你正在寻找带有该标签的节点,它也知道它可以使用的标签上有一个索引 - 这意味着它可以用您正在寻找的性能执行搜索.
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |