<div id="article_content" class="article_content clearfix" data-track-click="{"mod":"popu_307","con":",https://blog.csdn.net/Vensmallzeng/article/details/89299687"}">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<div class="htmledit_views" id="content_views">
<p><span style="color:#f33b45;">尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以</span><span style="color:#3399ea;">转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.csdn.net/vensmallzeng</span><span style="color:#f33b45;">。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:zengzenghe@gmail.com,谢谢合作! </span></p>
<p> </p>
<p> </p>
<p> 最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库。开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库查询效率的阶段,然而庆幸的是在这周就已经把数据库的查询效率优化的可以商用了。</p>
<p style="margin-left:0cm;"> 刚开始时,在公司的neo4j数据库中进行关联查询时,有些查询指令甚至长达两小时都未返回待查结果,以致无法满足一般的商业需求。后来经过查阅相关资料,获得了如下几种优化思路:</p>
<ul><li>1:增加索引</li>
<li>2:优化neo4j配置文件</li>
<li>3:增加服务器内存</li>
<li>4:增加ssd固态硬盘</li>
</ul><p>一、增加索引</p>
<p style="margin-left:0cm;">经查阅相关资料可知,neo4j数据库的索引一般分为三类。</p>
<p style="margin-left:0cm;">① 手动索引:Neo4j数据库若采用手动方式创建索引,则索引并不会随着数据的改变而自动更新。虽然该种方法可以手动创建和维护索引,但由于较为麻烦,所以一般不采用。</p>
<p style="margin-left:0cm;">② 自动索引:自动索引是一种通过修改配置文件来创建索引的方法,但是在目前的neo4j 3.x版本中已经摒弃了用该方法来创建索引,并建议使用模式索引代替之。</p>
<p style="margin-left:0cm;">③ 模式索引:模式索引和关系数据库中的索引很相似, 每一个索引会对应一个标签和一组属性,无论是更新还是删除节点,索引都会自动更新或者删除,因此该种创建索引的方式更适用。</p>
<p style="margin-left:0cm;"> 很显然采用模式索引会更简单方便,而建立模式索引,需要使用Cypher语句:CREATE INDEX ON: 标签(待查字段)。一般在浏览器<a href="http://172.18.34.25:7474/browser/" rel="nofollow">http://172.18.34.25:7474/browser/</a>网页上,可分别为待查字段建立模式索引。然而实验结果表明,建立索引后的查询时间虽有减少但不足以满足实际需求。<span style="color:#ff0000;">另外有一点非常重要,索引建立后只是Populating状态,一定要一定要一定要重启数据库并关闭</span><a href="http://172.18.34.25:7474/browser/" rel="nofollow">http://172.18.34.25:7474/browser/</a><span style="color:#ff0000;">网页让索引ONLINE生效,否则刚刚建的索引是无效的,望大家切记。</span><span style="color:#ff0000;">若不知道待查字段是否已有索引,可用“:schema”指令查看当前数据库中已建好的所有索引和索引是否ONLINE</span>。</p>
<p style="margin-left:0cm;">二、优化neo4j配置文件</p>
<p style="margin-left:0cm;">① 先明确neo4j的安装路径,然后执行“cd /home/public/Software/neo4j-community-3.3.7/conf/”指令进入指定目录下。<span style="color:#ff0000;">由于要对neo4j配置文件进行修改,为了保险起见建议在对<a name="_Hlk5804942">neo4j.conf</a>文件进行修改之前,先备份一份neo4j.conf文件。</span></p>
<p style="margin-left:0cm;">② 用“vim neo4j.conf”指令打开neo4j.conf文件并进行相应修改。经过查阅一些资料得知,通过添加jvm虚拟环境可以提高数据库的查询速度,即取消neo4j配置文件中关于dbms.memory.heap.initial_size=512m;dbms.memory.heap.max_size=512m两行的注释,并做合适的修改(<span style="color:#ff0000;">最大堆内存越大越好,但是要小于机器的物理内存</span>)。</p>
<p style="margin-left:0cm;">三、增加服务器内存(未实施)</p>
<p style="margin-left:0cm;">四、增加ssd固态硬盘(未实施)</p>
<p style="margin-left:0cm;"> 由于“增加索引”和“优化neo4j配置文件”已经可以让neo4j数据库的查询时间得到了较大的缩减,并能满足一般的商业需求,所以暂时还未进行“增加服务器内存”和“增加ssd固态硬盘”的优化操作。</p>
<p style="margin-left:0cm;"> </p>
<p style="margin-left:0cm;"><strong>心得体会</strong>:</p>
<p style="margin-left:0cm;">①:在测试前一定要为待查字段分别建立模式索引,建与不建的查询速度是非常显著的哈;</p>
<p style="margin-left:0cm;">②:索引创建后一定要ONLINE才会生效,这点把我坑的好惨啊!</p>
<p style="margin-left:0cm;">③:测试查询语句时,一定要尽可能将在一类标签中(其实相当于一张表)靠后或靠中间的节点属性作为查询条件,这样才能遍历更多的节点,故所得的测试结果才会真实可信;</p>
<p style="margin-left:0cm;">④:增加WHERE语句、配合使用AND、OR等加大查询复杂度,另外还可以通过使用错误的范围语句来进行测试,如 "2020-10"<= P1.paper_publish_date <= "2017-10";</p>
<p style="margin-left:0cm;">⑤:测试语句也要将不存在的节点的属性作为查询条件,看返回空的时间如何;</p>
<p style="margin-left:0cm;">⑥:学会优化Cypher查询语句,如</p>
<p style="margin-left:0cm;">MATCH (a:Author)-[:author_is_in_field]->(f:Field)</p>
<p style="margin-left:0cm;">WHERE f.field_level = "L3"</p>
<p style="margin-left:0cm;">RETURN a.auhtor_name,f.field_name,f.field_reference_count</p>
<p style="margin-left:0cm;">LIMIT 10 </p>
<p style="margin-left:0cm;">可以优化成</p>
<p style="margin-left:0cm;">MATCH (a:Author)-[:author_is_in_field]->(f:Field{field_level:"L3"})</p>
<p style="margin-left:0cm;">RETURN a.auhtor_name,f.field_name,f.field_reference_count</p>
<p style="margin-left:0cm;">LIMIT 10</p>
<p style="margin-left:0cm;">⑦:测试过程中,要想尽一切用户可能使用的场景来进行测试,切不可有意回避某些使用场景,否则不过是自欺欺人而已。</p>
<p style="margin-left:0cm;"> </p>
<p style="margin-left:0cm;">给大家推荐几个neo4j数据库学习网站:</p>
<p style="margin-left:0cm;">【1】<a href="https://www.zhihu.com/question/45401120" rel="nofollow">https://www.zhihu.com/question/45401120</a></p>
<p style="margin-left:0cm;">【2】<a href="https://www.cnblogs.com/justcooooode/p/8182376.html" rel="nofollow">https://www.cnblogs.com/justcooooode/p/8182376.html</a></p>
<p style="margin-left:0cm;">【3】<a href="https://blog.csdn.net/qq_37242224/article/details/81325625" rel="nofollow">https://blog.csdn.net/qq_37242224/article/details/81325625</a></p>
<p style="margin-left:0cm;">【4】<a href="https://www.cnblogs.com/qianguyihao/category/587723.html" rel="nofollow">https://www.cnblogs.com/qianguyihao/category/587723.html</a></p>
<p style="margin-left:0cm;">【5】<a href="https://www.cnblogs.com/loveis715/p/5277051.html" rel="nofollow">https://www.cnblogs.com/loveis715/p/5277051.html</a></p>
<p style="margin-left:0cm;">【6】<a href="https://blog.csdn.net/u011697278/article/details/52462420" rel="nofollow">https://blog.csdn.net/u011697278/article/details/52462420</a></p>
<p style="margin-left:0cm;">【7】<a href="https://www.w3cschool.cn/neo4j/neo4j_need_for_graph_databses.html" rel="nofollow">https://www.w3cschool.cn/neo4j/neo4j_need_for_graph_databses.html</a></p>
<p style="margin-left:0cm;">【8】<a href="https://blog.csdn.net/u013946356/article/details/81739079" rel="nofollow">https://blog.csdn.net/u013946356/article/details/81739079</a></p>
<p style="margin-left:0cm;"> </p>
<p style="margin-left:0cm;"> </p>
<p style="margin-left:0cm;">日积月累,与君共进,增增小结,未完待续。</p>
</div>
</div>