Multithreading 服务器插件查询的Neo4j优化问题
我正在尝试优化模糊搜索查询。它相当大,因为它在数据库中的大多数属性中搜索单个单词。我有一些问题,关于我一直在做的一些事情,以提高搜索速度 测试信息:我添加了大约10000个节点,正在搜索大约40个属性。根据条件,我的查询时间大约为3-30秒Multithreading 服务器插件查询的Neo4j优化问题,multithreading,performance,caching,cypher,neo4j,Multithreading,Performance,Caching,Cypher,Neo4j,我正在尝试优化模糊搜索查询。它相当大,因为它在数据库中的大多数属性中搜索单个单词。我有一些问题,关于我一直在做的一些事情,以提高搜索速度 测试信息:我添加了大约10000个节点,正在搜索大约40个属性。根据条件,我的查询时间大约为3-30秒 MATCH (n) WHERE (n:Type__Exercise and ( n.description =~ '(?i).*criteria.*' or n.name =~ '(?i).*criteria.*' )) or (n:Type_
MATCH (n) WHERE
(n:Type__Exercise and ( n.description =~ '(?i).*criteria.*' or n.name =~ '(?i).*criteria.*' )) or
(n:Type__Fault and ( n.description =~ '(?i).*criteria.*' or n.name =~ '(?i).*criteria.*' ))
with n LIMIT 100
return count(n)
这基本上是我的查询,但是有很多OR子句。在将查询发送到执行引擎时,我也使用参数。我意识到在每个属性上使用正则表达式是非常昂贵的。我希望我可以在不进行精确匹配的情况下获得足够好的性能,最多可以匹配一定数量的数据(此应用程序一次只能有1-10个用户查询)在新标签索引支持全文查询之前,这可能是我们正在调查的一项临时工作。
首先,如何判断我的查询是否缓存?我通过curl命令调用我的服务器插件,每次通过相同的条件时,我看到的时间几乎相同(时间是整个curl命令完成的时间)。我使用的是执行引擎的一个实例,它是使用GraphDatabaseService创建的,GraphDatabaseService通过@Source参数传递给插件如果缓存查询,我应该看到多大的改进?
是否存在一个查询大小,Neo4j不需要缓存查询?
LIMIT子句在加快查询速度方面有多有效?我添加了一个,但没有看到性能有很大提高(对于有结果的查询)。执行引擎找到足够的节点后是否停止
我的查询只准备好了,我还需要用事务来包装我的通话吗?
我可以拆分查询,以便一次只搜索一个属性,或者说一次搜索4个属性。然后我可以通过执行引擎运行整个查询集。这似乎更适合缓存,但运行多个小查询而不是一个大查询是否会增加成本?如果我启动了10个线程怎么办?是否有足够的性能提升使其值得一试?
在Neo4j控制台中使用PROFILE时,有没有一种方法可以使用参数?我一直在尝试使用它来查看我在查询中获得了多少db命中率
Neo4j浏览器在比较执行查询所需时间方面的效果如何?
缓存发生在这里吗
如果我想为查询预热Neo4j数据,我可以运行我期望的精确查询吗?查询是否需要返回数据,或者计数类型查询是否会使缓存升温?作为替代方案,我应该迭代所有节点吗?我宁愿只搜索可能被搜索的节点,而不是所有的节点。我认为目前最好使用全文旧式索引设施,我最近写了一篇关于它的博客文章: 如果您不想这样做: 我可能还会重写您的查询以扭转局面:
MATCH (n)
WHERE
(n:Type__Exercise OR n:Type__Fault) AND
(n.description =~ '(?i).*criteria.*' OR n.name =~ '(?i).*criteria.*' )
您还可以通过使用第二个“搜索”字段获得更多好处,该字段只是说明
和名称
字段的串联。您可能还想改进您的regexp,比如添加单词边界\b
左右
关于你的问题:
首先,如何判断我的查询是否已缓存?
如果使用参数(对于regexp),查询将被缓存。有一个可配置的查询缓存大小(默认为100个查询)
是否有一个查询大小,Neo4j不需要缓存查询?
Neo4j当前缓存所有传入的查询,无论大小
我的查询只准备好了,我还需要用事务包装我的呼叫吗?
Cypher将创建自己的事务。通常,读取事务是必需的。对于cypher,如果希望多个查询参与同一tx范围,则需要外部事务
运行多个小查询而不是一个大查询是否会增加成本?如果我踢出10个线程呢?是否会有足够的性能提升来让这段时间变得值得?
这取决于较小的查询执行得更快(如果它们涉及的数据集较少),但您必须在客户端合并它们的结果
如果它们接触到相同的节点,则执行双重工作
对于更大的查询,当跨积或指数路径爆炸时,您必须小心
关于使用多个线程运行较小的查询
好问题,应该更快。目前,我们将要消除一些瓶颈。试试看
在Neo4j控制台中使用配置文件时,是否有使用参数的方法?
您可以使用shell变量,使用export name=value
并使用env
e、 g
Neo4j浏览器在比较执行查询所需时间方面的效果如何?
浏览器测量可能有更多数据加载的完整往返,因此它的计时不是很准确
热身
确切的问题是有意义的
您不必返回数据,
返回计数(*)
就足够了,但您应该访问要访问的属性以确保它们已加载。我的查询似乎没有被缓存。我多次使用相同的查询启动服务器插件,它运行的秒数相同。可能有一个我没有看到的小差异,但是如果我的查询需要20秒,我觉得如果缓存查询,应该至少会减少一秒的执行时间。这就是为什么我想知道缓存性能的预期提高。目前,我确实试图避免使用遗留索引,但是
export name=Lisa
profile match (n:User {name:{name}}) return n;