【问题标题】:DSE Graph Index on Integer Interval整数区间的 DSE 图形索引
【发布时间】:2016-11-26 18:38:33
【问题描述】:

目前,我通过 DSE 图形引擎存储了一个包含 10 万个节点的图形。这些节点具有标签“客户”和一个名为“年龄”的属性,它允许整数值。我已使用以下命令索引此属性:

schema.vertexLabel("customer").index("custByAge").secondary().by("age").add()

我希望能够使用此索引来回答寻找特定年龄范围内客户的查询(例如,“年龄”在 10 到 20 岁之间)。但是,当我按年龄间隔查询客户时,似乎并没有真正使用我创建的索引。

当我提交以下查询时,在大约 40ms 内返回了一个顶点列表,这让我相信该索引正在被使用:

g.V().has('customer','age',15)

但是当我提交以下查询时,查询会在 30 秒后超时(正如我在配置中指定的那样):

g.V().has('customer','age',inside(10,20))
Interruption of result iteration
Display stack trace? [yN]

这让我相信该索引没有用于此查询。这看起来对吗?如果没有使用索引,是否有人对我如何加快此查询有一些建议?

编辑 正如下面的答案所建议的那样,我对上述每个查询都运行了 .profile ,结果如下(仅显示相关信息):

gremlin> g.V().has('customer','age',21).profile()
==>Traversal Metrics
...
  index-query                    14.333ms

gremlin> g.V().has('customer','age',inside(21,23)).profile()
==>Traversal Metrics
...
   index-query                    115.055ms
   index-query                    132.144ms
   index-query                    132.842ms
   >TOTAL                       53042.171ms

这给我留下了几个问题:

  1. .profile() 返回index-query 是否意味着索引正在用于我的第二个查询?
  2. 为什么第二个查询有 3 个索引查询,而第一个查询有 1 个?
  3. 所有索引查询组合起来,对于第二个查询,总计约 400 毫秒。为什么整个查询需要约 50000 毫秒? .profile() 命令除了这些索引查询之外没有显示任何其他需要时间的东西,那么额外的 50000 毫秒是从哪里来的?

【问题讨论】:

  • 整个 .profile() 输出将会很有用。此外,如果使用 DataStax Studio,则可以通过将鼠标悬停在各个行上来检查注释详细信息。
  • 可能是 3 个索引查询,因为中间结果大小达到了 50k 个元素的限制..?你期待多少元素?请注意,二级索引对于大型结果来说是一个糟糕的选择,您应该尝试使用搜索索引。

标签: datastax datastax-enterprise gremlin


【解决方案1】:

您在使用 DataStax Studio 吗?如果是这样,您可以使用 .profile() 功能来了解索引是如何参与的?

示例 .profile() 使用: g.V().in().has('name','Julia Child').count().profile()

【讨论】:

  • 谢谢!请查看我的帖子的编辑...似乎索引可能正在被使用,但它花费的时间比它应该的要长得多。
【解决方案2】:

你想在这种情况下使用搜索索引,它会快得多。

例如,在 KillRVideo 中:

schema.vertexLabel("movie").index("search").search().by("year").add()

g.V().hasLabel('movie').has('year', gt(2000)).has('year', lte(2017)).profile()

然后从 Studio profile() 中我们可以看到:

SELECT "community_id", "member_id" FROM "killrvideo"."movie_p" WHERE 
"solr_query" = '{"q":"*:*", "fq":["year:{2000 TO *}","year:{* TO 
2017]"]}' LIMIT ?; with params (java.lang.Integer) 50000

默认情况下,分析器不会显示所有操作的跟踪,因此您看到的索引查询列表可能会被截断。根据本文档修改“max_profile_events”:https://docs.datastax.com/en/dse/5.1/dse-dev/datastax_enterprise/graph/reference/schema/refSchemaConfig.html

【讨论】:

    猜你喜欢
    • 2016-12-15
    • 2017-07-11
    • 1970-01-01
    • 2016-06-03
    • 2017-05-27
    • 2013-09-30
    • 2018-04-15
    • 2020-03-27
    • 2017-01-09
    相关资源
    最近更新 更多