拥有以下结构的文件:
{
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是否能够为这些类型的查询使用多个索引?我阅读了关于索引使用的文档页面,但我还不清楚。
答案 0 :(得分:2)
如果过滤条件与 logical或组合,ArangoDB可以在同一个集合上使用多个索引,并且索引满足或分支条件。
对于您的查询,您有三个条件与逻辑和相结合,后者包含或。
AQL中没有STARTS WITH
谓词,但您可以使用由前缀bounds:e.path >= @lower && e.path < @upper
构造的范围查询。对于"somePrefix"
的搜索值,边界将转换为@upper
为"somePrefix", and
@ lower being
&#34; somePrefiy&#34;`(搜索值增加最后一个字符)一个)。
在path
上创建跳过列表索引将使查询使用该索引。
包括enabled
的搜索条件,截至目前的合并条件为e.path >= @lower && e.path < @upper && e.enabled <= @timestamp
。虽然可以在多个属性上创建跳过列表索引,但它不会在path
和enabled
上使用,而只能在path
上使用。颠倒索引属性的顺序(即先enabled
,然后path
)也不会有任何帮助,因为索引只会在enabled
上使用,但不会在{path
上使用1}}。
通常,skiplist索引将用于可以产生连续范围的条件部分。如果最左侧的索引属性用于相等比较(例如e.path == @path && e.enabled <= @timestamp
将起作用),但是如果其最左侧的索引属性是非相等比较(例如e.path >= @lower && e.path <= @upper
或{{ 1}}),然后它不会查看其进一步的索引属性,因为它无论如何都会产生一个非连续的范围。
还可以选择在@e.enabled <= @timestamp
上创建跳过列表索引。这允许优化器在部件disabled
上使用该索引。它可以将其转换为e.enabled <= @timestamp && (e.disabled == null || @timestamp < e.disabled)
,但这看起来并不是很有选择性。
总结:对于该特定查询,似乎没有一个好的索引选择。如果您可以某种方式将e.disabled == null || @timestamp < e.disabled
更改为相等比较,那么您可以在STARTS WITH
和path
上创建组合的跳转列表索引,并且它可能具有相当的选择性。
如果enabled
前缀的大小始终相同,则可以将前缀保存在额外属性中,可以将其编入索引而不是原始值,并使用相等比较查询:STARTS WITH
。
这需要为每个文档保存和维护一个额外的前缀属性,但是在启用更多选择性索引时可能是值得的。