具有以下结构的文档:
{
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 是否能够利用多个索引来执行这些类型的查询?我阅读了有关索引使用的文档页面,但我仍然不清楚。
如果过滤条件与逻辑或,且指标满足or分支机构条件。
在您的查询中,您需要结合三个条件逻辑和,后者包含一个or.
没有STARTS WITH
AQL 中的谓词,但您可以使用使用前缀边界构造的范围查询:e.path >= @lower && e.path < @upper
。对于搜索值为"somePrefix"
,界限将转换为@upper
being "somePrefix", and
@lowerbeing
“somePrefiy”`(最后一个字符的搜索值加一)。
创建跳跃列表索引path
将使查询使用该索引。
包括搜索条件enabled
,到目前为止的组合条件是e.path >= @lower && e.path < @upper && e.enabled <= @timestamp
。虽然可以在多个属性上创建跳跃列表索引,但这里不会在这两个属性上使用它path
and enabled
,但仅限于path
。反转索引属性的顺序(即enabled
首先,然后path
)也无济于事,因为这样索引将用于enabled
仅,但不于path
.
一般来说,跳表索引将用于条件中可以产生连续范围的部分。如果最左边的索引属性用于相等比较(例如e.path == @path && e.enabled <= @timestamp
会起作用),但如果其最左边的索引属性是非相等比较(例如e.path >= @lower && e.path <= @upper
or @e.enabled <= @timestamp
),那么它不会查看其进一步的索引属性,因为无论如何它都会产生不连续的范围。
还可以选择创建跳过列表索引disabled
。这允许优化器在零件上使用该索引e.enabled <= @timestamp && (e.disabled == null || @timestamp < e.disabled)
。它可以将其转变为e.disabled == null || @timestamp < e.disabled
,然而这看起来并不是很有选择性。
总之:对于该特定查询似乎没有一个好的索引选择。如果你能以某种方式改变STARTS WITH
进行相等比较,那么您可以创建一个组合的跳过列表索引path
and enabled
,而且它可能是相当有选择性的。
如果你的STARTS WITH
前缀总是相同的大小,可能值得将前缀保存在额外的属性中,该属性可以代替原始值进行索引,并使用相等比较进行查询:e.pathPrefix == @prefix && e.enabled <= @timestamp
。
这需要为每个文档保存和维护额外的前缀属性,但在启用更具选择性的索引时可能是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)