2016-02-23 23 views
2

有一个如下结构的文件多索引的使用:论ArangoDB

{ 
    path: String, 
    enabled: Long, 
    disabled: null || Long, 
    // other fields... 
} 

我想通过路径的前缀和一些数量和文件的时间戳之间的数值关系的组合看文件了(伪)

SELECT e FROM entries 
WHERE 
    e.path STARTS WITH "somePrefix" 
    AND e.enabled <= timestamp 
    AND (
    e.disabled == null 
    OR timestamp < e.disabled 
) 

什么样的索引结构最受益?我应该在enabled字段上有一个非稀疏跳过列表索引+ disabled上有一个稀疏跳过列表索引,并且path上有一个全文非稀疏索引吗? ArangoDB能够为这些类型的查询使用多个索引吗?我阅读索引使用的文档页面,但我仍然不清楚。

回答

2

ArangoDB可以在同一个收集使用多个索引如果过滤条件与逻辑或组合,并且索引满足分支条件。

在您的查询的情况下,你有三个条件与逻辑和相结合,用含有后者。

AQL中没有STARTS WITH谓词,但是您可以使用使用前缀范围构造的范围查询:e.path >= @lower && e.path < @upper。对于搜索值"somePrefix",边界将翻译为@upper,即"somePrefix", and @lower being“somePrefiy”(搜索值最后一个字符增加1)。

path上创建跳过列表索引将使查询使用该索引。

包括搜索条件enabled,到目前为止的组合条件是e.path >= @lower && e.path < @upper && e.enabled <= @timestamp。尽管可以在多个属性上创建跳过列表索引,但它不会在pathenabled这两个位置上使用,但仅在path上使用。反转索引属性的顺序(即enabled第一个,然后path)也无济于事,因为索引仅用于enabled,而不用于path

通常,skiplist索引将用于可产生连续范围的条件部分。如果在等号比较中使用最左侧的索引属性(例如e.path == @path && e.enabled <= @timestamp将起作用),但是如果其最左侧的索引属性是不相等比较(例如e.path >= @lower && e.path <= @upper@e.enabled <= @timestamp),则不会看其进一步的索引属性,因为它会产生一个非连续的范围。

还有在disabled上创建跳过列表索引的选项。这使得优化器可以在部分e.enabled <= @timestamp && (e.disabled == null || @timestamp < e.disabled)上使用该索引。它可以将其转换为e.disabled == null || @timestamp < e.disabled,但这看起来不太有选择性。

总之:对于特定的查询似乎没有好的索引选择。如果您可以以某种方式将STARTS WITH更改为平等比较,那么您可以在pathenabled上创建一个组合的跳过列表索引,并且它可能会相当有选择性。 如果您的STARTS WITH前缀始终大小相同,则可能需要将前缀保存在一个额外的属性中,该属性可以被索引而不是原始值,并且可以使用相等比较来查询:e.pathPrefix == @prefix && e.enabled <= @timestamp。 这需要为每个文档保存和维护额外的前缀属性,但是在启用更具选择性的索引时可能值得它。

+0

非常感谢您提供这样详细的答案!我想我会更多地修改模式,或许我可以想出更方便的东西。 – tkroman

+0

您能否将答案标记为已接受?或者你仍然错过一些信息? – dothebart