1. 程式人生 > >neo4j性能調優(轉)

neo4j性能調優(轉)

linu 原創文章 基本 查詢條件 date 關聯 無法 博文 rap

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

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

1:增加索引
2:優化neo4j配置文件
3:增加服務器內存
4:增加ssd固態硬盤
一、增加索引

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

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

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

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

很顯然采用模式索引會更簡單方便,而建立模式索引,需要使用Cypher語句:CREATE INDEX ON: 標簽(待查字段)。一般在瀏覽器http://172.18.34.25:7474/browser/網頁上,可分別為待查字段建立模式索引。然而實驗結果表明,建立索引後的查詢時間雖有減少但不足以滿足實際需求。另外有一點非常重要,索引建立後只是Populating狀態,一定要一定要一定要重啟數據庫並關閉http://172.18.34.25:7474/browser/網頁讓索引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.paper_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{field_level:"L3"})

RETURN a.auhtor_name,f.field_name,f.field_reference_count

LIMIT 10

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

給大家推薦幾個neo4j數據庫學習網站:

【1】https://www.zhihu.com/question/45401120

【2】https://www.cnblogs.com/justcooooode/p/8182376.html

【3】https://blog.csdn.net/qq_37242224/article/details/81325625

【4】https://www.cnblogs.com/qianguyihao/category/587723.html

【5】https://www.cnblogs.com/loveis715/p/5277051.html

【6】https://blog.csdn.net/u011697278/article/details/52462420

【7】https://www.w3cschool.cn/neo4j/neo4j_need_for_graph_databses.html

【8】https://blog.csdn.net/u013946356/article/details/81739079
---------------------
作者:Vensmallzeng
來源:CSDN
原文:https://blog.csdn.net/Vensmallzeng/article/details/89299687
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

neo4j性能調優(轉)