如果过滤条件与逻辑或组合,并且索引满足或分支条件,ArangoDB可以在同一个集合上使用多个索引。
就您的查询而言,您有三个条件与逻辑和组合,后者包含一个或。
AQL 中没有 STARTS WITH 谓词,但您可以使用使用前缀边界构造的范围查询:e.path >= @lower && e.path < @upper。对于"somePrefix" 的搜索值,边界将转换为@upper,即"somePrefix", and@lowerbeing"somePrefiy"`(最后一个字符的搜索值加一)。
在path 上创建一个skiplist 索引将使查询使用该索引。
包括enabled的搜索条件,到现在的组合条件是e.path >= @lower && e.path < @upper && e.enabled <= @timestamp。虽然可以在多个属性上创建跳过列表索引,但它不会在path 和enabled 上使用,而仅在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 更改为相等比较,那么您可以在path 和enabled 上创建一个组合的skiplist 索引,它可能具有相当的选择性。
如果您的STARTS WITH 前缀始终大小相同,则可能值得将前缀保存在一个额外的属性中,该属性可以被索引而不是原始值并使用相等比较进行查询:e.pathPrefix == @prefix && e.enabled <= @timestamp。
这需要为每个文档保存和维护一个额外的前缀属性,但在启用更具选择性的索引时可能值得。