【问题标题】:how to improve the titan query performance when I have more than one conditions当我有多个条件时如何提高 Titan 查询性能
【发布时间】:2017-02-23 15:58:11
【问题描述】:

titan-0.5.4中大约有10,000,000条记录(存储后端是hbase和es索引),我只想找到特定圆圈内的顶点并且还有标签“shop”。查询(查询成本)运行大约 1 秒,但获取顶点(迭代器成本)花费了太多时间。我想知道泰坦如何处理以下多种情况:

    long start = System.currentTimeMillis();
    Iterator<Vertex> iterator = graph.query().has("geo",Geo.WITHIN, circle(40, 116, 15)).has("label","shop").vertices().iterator();

    long end = System.currentTimeMillis();
    System.out.println("query cost(ms):" + (end - start));

    Set<Vertex> targetVertices = new HashSet<Vertex>();
    start = System.currentTimeMillis();
    while (iterator.hasNext()){
        targetVertices.add(iterator.next());
    }
    end = System.currentTimeMillis();
    System.out.println("iterator cost(ms):" + (end - start));
    System.out.println("vertices count): " + targetVertices.size());

为什么这么慢,如何提高查询性能?

【问题讨论】:

  • 如果query cost(ms)是1秒,那么iteration cost(ms)vertices count是什么?
  • 像上面的代码一样,我只是在很长一段时间内(可能是 20 分钟)都无法得到结果。但是当我第一次只是使用循环条件,然后使用迭代器过滤“商店”标签时。而迭代器耗时约80s,圆条件得到约60000个顶点,有效顶点为100个。这是否证明标签条件不是基于圆条件?
  • 您是否使用geolabel 键定义了索引?类似mgmt.buildIndex('geoAndLabel',Vertex.class).addKey(geo).addKey(label).buildMixedIndex("search")s3.thinkaurelius.com/docs/titan/0.5.4/indexes.html#index-mixed
  • 是的,我做到了。如果没有索引,则会打印警告。

标签: titan multiple-conditions


【解决方案1】:

在所有顶点中:

  • 如果圆中的顶点数量可能多于标签为“shop”的顶点:您应该首先放置“has shop”条件。
  • 如果有标签商店的顶点多于可能在圆圈中的顶点:您仍然应该首先放置“有商店”条件。

您检查的圆圈内的点越少,它应该越快。

对于查询的速度,我认为查询本身不会进行比较,它更有可能被延迟到您尝试访问结果之前,这应该可以解释获取迭代器所花费的时间。

【讨论】:

  • 感谢您这么快的回复!我也尝试将“有商店”条件放在首位,但没有效果。而且我也怀疑在我尝试访问结果之前它不会执行查询,但不确定它是否正确。虽然我认为它不应该这么慢。
  • 也许你应该只用车间条件和只用圆形条件测量相同的过程,看看是否一个比另一个花费更长的时间。
  • 是的,我做到了。首先,我只是使用循环条件,然后使用迭代器过滤“商店”标签。它似乎更快一点,但还不够。我怀疑“有商店”条件不是基于循环条件的结果。
  • 我知道的方法几乎都试过了,都没有效果。
猜你喜欢
  • 2013-12-15
  • 2012-04-10
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2018-06-17
相关资源
最近更新 更多