neo4j查询语句,在第一次查询的时候会很慢,后面就会快很多,这是为什么,如何优化?
“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]的数据目前也比较多,我刚试了将查询条件位置调换,第一次查还是会很慢,查了下说是要数据预热,结果我跑了一下预热的语句,到现在没跑完。。
非大佬,刚入门的新手玩家。不清楚具体数据
- 可以试着 查询头部加入 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}