neo4j 查詢效率的幾種優化思路

2021-09-18 04:58:52 字數 2209 閱讀 3210

尊敬的讀者您好:筆者很高興自己的文章能被閱讀,但原創與編輯均不易,所以

最近在公司實習做的就是優化neo4j圖形資料庫查詢效率的事,公司提供的是乙個在linux上搭建且擁有幾億個節點的資料庫。開始一段時間主要是熟悉該資料庫的一些基本操作,直到上週才正式開始步入了優化資料庫查詢效率的階段,然而慶幸的是在這週就已經把資料庫的查詢效率優化的可以商用了。

剛開始時,在公司的neo4j資料庫中進行關聯查詢時,有些查詢指令甚至長達兩小時都未返回待查結果,以致無法滿足一般的商業需求。後來經過查閱相關資料,獲得了如下幾種優化思路:

一、增加索引

經查閱相關資料可知,neo4j資料庫的索引一般分為三類。

① 手動索引:neo4j資料庫若採用手動方式建立索引,則索引並不會隨著資料的改變而自動更新。雖然該種方法可以手動建立和維護索引,但由於較為麻煩,所以一般不採用。

② 自動索引:自動索引是一種通過修改配置檔案來建立索引的方法,但是在目前的neo4j 3.x版本中已經摒棄了用該方法來建立索引,並建議使用模式索引代替之。

③ 模式索引:模式索引和關聯式資料庫中的索引很相似, 每乙個索引會對應乙個標籤和一組屬性,無論是更新還是刪除節點,索引都會自動更新或者刪除,因此該種建立索引的方式更適用。

很顯然採用模式索引會更簡單方便,而建立模式索引,需要使用cypher語句:create index on: 標籤(待查字段)。一般在瀏覽器網頁上,可分別為待查字段建立模式索引。然而實驗結果表明,建立索引後的查詢時間雖有減少但不足以滿足實際需求。另外有一點非常重要,索引建立後只是populating狀態,一定要一定要一定要重啟資料庫並關閉

網頁讓索引online生效,否則剛剛建的索引是無效的,望大家切記。

若不知道待查字段是否已有索引,可用「:schema」指令檢視當前資料庫中已建好的所有索引和索引是否online。

二、優化neo4j配置檔案

① 先明確neo4j的安裝路徑,然後執行「cd /home/public/software/neo4j-community-3.3.7/conf/」指令進入指定目錄下。由於要對neo4j配置檔案進行修改,為了保險起見建議在對neo4j.conf檔案進行修改之前,先備份乙份neo4j.conf檔案。

② 用「vim neo4j.conf」指令開啟neo4j.conf檔案並進行相應修改。經過查閱一些資料得知,通過新增jvm虛擬環境可以提高資料庫的查詢速度,即取消neo4j配置檔案中關於dbms.memory.heap.initial_size=512m;dbms.memory.heap.max_size=512m兩行的注釋,並做合適的修改(最大堆記憶體越大越好,但是要小於機器的物理記憶體)。

三、增加伺服器記憶體(未實施)

四、增加ssd固態硬碟(未實施)

由於「增加索引」和「優化neo4j配置檔案」已經可以讓neo4j資料庫的查詢時間得到了較大的縮減,並能滿足一般的商業需求,所以暫時還未進行「增加伺服器記憶體」和「增加ssd固態硬碟」的優化操作。

心得體會

①:在測試前一定要為待查字段分別建立模式索引,建與不建的查詢速度是非常顯著的哈;

②:索引建立後一定要online才會生效,這點把我坑的好慘啊!

③:測試查詢語句時,一定要盡可能將在一類標籤中(其實相當於一張表)靠後或靠中間的節點屬性作為查詢條件,這樣才能遍歷更多的節點,故所得的測試結果才會真實可信;

④:增加where語句、配合使用and、or等加大查詢複雜度,另外還可以通過使用錯誤的範圍語句來進行測試,如 "2020-10"<= p1.*****_publish_date <= "2017-10";

⑤:測試語句也要將不存在的節點的屬性作為查詢條件,看返回空的時間如何;

⑥:學會優化cypher查詢語句,如

match (a:author)-[:author_is_in_field]->(f:field)

where f.field_level = "l3"

return a.auhtor_name,f.field_name,f.field_reference_count

limit 10  

可以優化成

match (a:author)-[:author_is_in_field]->(f:field)

return a.auhtor_name,f.field_name,f.field_reference_count

limit 10

⑦:測試過程中,要想盡一切使用者可能使用的場景來進行測試,切不可有意迴避某些使用場景,否則不過是自欺欺人而已。

日積月累,與君共進,增增小結,未完待續。

neo4j查詢優化

1 使用match時,避免使用多個標籤。搜尋使用了2個標籤,同樣的事情竟然訪問了資料庫801次。這是因為cypher執行了額外的 haslabel 過濾器。可以通過使用專門的關係型別來解決這樣的問題,比如為他們新增published和drafted關係,然後用關係來找到指定使用者的published...

Neo4j 空間查詢

1.neo4j自帶函式進行簡單計算 neo4j自帶distance point1,point2 函式,返回乙個浮點數,表示同一座標參照系中兩點之間的測地距離,可以使用round函式來進行四捨五入。目前neo4j3.3版本不支援return直接返回point型別,3.4版本可以。節點型別 節點格式 詳...

neo4j 查詢cypher話語

engine.execute start n node people return n params skip和limit的數字引數12 345mapparams new hashmap params.put s 1 params.put l 1 executionresult result eng...