簡體   English   中英

neo4j緩存如何加快查詢速度?

[英]how are neo4j caches speeding up queries?

我目前正在使用Neo4j作為數據庫和涉及一些困難關系發現的查詢的項目,在運行性能測試后,我們遇到了一些問題。

我們發現緩存會瘋狂地影響請求的時間(從3000ms到100ms左右)。 兩次執行相同的請求將導致一個速度非常慢,而第二次則要快得多。 經過一些搜索,我們看到了預熱方法,該方法將預加載數據庫中的所有節點和關系,查詢如下所示:

match (n)-[r]->() return count(1);

激活了緩存以及此預熱查詢后,我們的查詢時間大大減少了,但速度卻不及查詢相同查詢的兩倍,三倍或四倍。

因此,我們繼續測試和搜索信息,直到我們看到Neo4j還以某種方式緩沖了查詢以便每次都不進行編譯(如果我是對的,請使用Scala編譯器)。 我以某種方式說,因為經過嚴格的測試,我可以斷定Neo4j正在“即時”編譯查詢。

讓我展示我的意思的簡化示例:

structure_example

(數字是id屬性)

如果我發出如下請求:

match (n:green {id: 1})-[r]->(:red)-[s]->(:green)<-[t]-(m:yellow {id: 7}) 
return count(m);

我要做的是查找節點1和節點之間是否存在連接。 如您所見,我必須發現一堆節點以及更重要的關系,並且編譯過程看起來多少有些復雜,因為請求完成了1227 ms。 如果再次發出完全相同的請求,我將獲得大約5毫秒的響應時間,足以通過性能測試。 肯定是Neo4j或Scala編譯器也在緩沖密碼查詢。

在了解了密碼請求中有一個編譯過程之后,我更深入了,開始只修改已經緩沖的請求的一部分。 更改最后匹配的節點的label或id參數也會產生延遲,但只有〜19 ms,仍然可以接受:

match (n:green {id: 1})-[r]->(:red)-[s]->(:green)<-[t]-(m:purple {id: 7}) 
return count(m);

但是,當我重新啟動服務器時,請進行預熱並調整查詢,以使第一個節點(之前標記為n)不匹配,查詢將以0個結果非常快速地響應,因此我可以推斷出並非所有查詢進行了解析,因為第一個節點不匹配,因此無需深入樹中。

我還嘗試了可選匹配,如果未找到匹配項,則返回null,但也不起作用。

我想首先問一下到目前為止,我在測試中說的所有內容是否正確,如果不正確,它實際上是如何工作的? 其次,當服務器啟動時,我應該怎么做(如果有辦法)在開始時緩存所有內容。 不幸的是,該項目的要求說查詢應該表現良好,甚至第一個查詢也要表現良好(並不是說實際場景中有成千上萬個關系和節點,這使得一切變慢了),或者沒有辦法避免這種延遲。

首先,您需要考慮對JVM進行預熱-請注意,在需要時(您的第一個查詢)延遲加載類,並且JIT可能僅在數以千計的調用后才啟動。

這個

match (n)-[r]->() return count(1);

應該正確預熱節點和關系緩存,但是我不確定它是否也加載了它們的所有屬性和索引。 還要確保您的數據集適合內存。

直接在密碼查詢中提供如下值: {id: 1} ,而不使用參數{id: {paramId}}意味着,當您更改id的值時,需要再次編譯查詢。

您可以在shell中以這種方式傳遞參數:

neo4j-sh (?)$ export paramId=5
neo4j-sh (?)$ return {paramId};
==> +-----------+
==> | {paramId} |
==> +-----------+
==> | 5         |
==> +-----------+
==> 1 row
==> 4 ms

因此,如果您需要從頭開始執行查詢

  • 更改查詢以使用參數
  • 在啟動時執行其他查詢以及熱身查詢

編輯 :添加信息如何在外殼中傳遞參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM