neo4j查询语句,在第一次查询的时候会很慢,后面就会快很多,这是为什么,如何优化?
发布于 4 年前 作者 lihongze 1700 次浏览 来自 问答

“MATCH p=(a:article{articleId:{sa_id}})-[:tag_of]->(t:tag)<-[:tag_of]-(ar:article{isDelete:false,type:1})” + " WHERE NOT ar.source IN [1,14,2] AND ar.cTimeStamp >= {timestamp_min}" + " AND NOT ar.articleId IN {flush_historys} " + " WITH ar,count(t) as rlanum order by rlanum desc,ar.uTimeStamp desc"+ " MATCH (ar)-[auto:source_of]->(aut:source)" + " WITH aut, head(COLLECT(ar)) AS topByAu" + " RETURN topByAu.articleId LIMIT {num_limit} 这是查询语句,我在图数据库中运行此条查询语句时,发现之后第一次查询会很慢,十几秒的样子,后面就会快很多,这是为什么?

3 回复

  • 关于第一次慢,第二次快一些。我觉得应该是在查过一次后做了类似的标记或者缓存之类的操作,具体内部原理不清楚。

  • 关于优化,** 首先确保你的source,cTimeStamp,articleId都加入了索引。 **

  • 使用 WHERE NOT ar.source IN [1,14,2]相比 WHERE ar.source IN [1,14,2] 查询效率差很多. 如果 ar.source IN [1,14,2]的情况比较少,在判断完
ar.cTimeStamp >= {timestamp_min}AND NOT ar.articleId IN {flush_historys}

再判断 WHERE NOT ar.source IN [1,14,2] 怎么样


@lisabiya 感谢大佬解答,目前索引是都有加的,ar.source IN [1,14,2]的数据目前也比较多,我刚试了将查询条件位置调换,第一次查还是会很慢,查了下说是要数据预热,结果我跑了一下预热的语句,到现在没跑完。。

@lihongze

非大佬,刚入门的新手玩家。不清楚具体数据

  • 可以试着 查询头部加入 profile ,看具体那一块DB 查询的多
  • 如果固定排除 [1,14,2] 。批量跑一遍数据,把满足条件的数据加个标记怎么样。

例如

//批量跑一遍  (flag 添加索引)
CALL apoc.periodic.iterate(
  "MATCH (ar:article{isDelete:false,type:1}) RETURN ar",
  'WHERE NOT ar.source IN [1,14,2] SET ar.flag=1',
  {batchSize:10000, parallel:true})
  
//这样下次查询只要这样,减少db hit  
MATCH p=(a:article{articleId:{sa_id}})-[:tag_of]->(t:tag)<-[:tag_of]-(ar:article{flag:1})
WHERE  ar.cTimeStamp >= {timestamp_min}AND NOT ar.articleId IN {flush_historys}

下载.jpg

回到顶部