【发布时间】: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
这给我留下了几个问题:
- .profile() 返回
index-query是否意味着索引正在用于我的第二个查询? - 为什么第二个查询有 3 个索引查询,而第一个查询有 1 个?
- 所有索引查询组合起来,对于第二个查询,总计约 400 毫秒。为什么整个查询需要约 50000 毫秒? .profile() 命令除了这些索引查询之外没有显示任何其他需要时间的东西,那么额外的 50000 毫秒是从哪里来的?
【问题讨论】:
-
整个 .profile() 输出将会很有用。此外,如果使用 DataStax Studio,则可以通过将鼠标悬停在各个行上来检查注释详细信息。
-
可能是 3 个索引查询,因为中间结果大小达到了 50k 个元素的限制..?你期待多少元素?请注意,二级索引对于大型结果来说是一个糟糕的选择,您应该尝试使用搜索索引。
标签: datastax datastax-enterprise gremlin