gpt4 book ai didi

arangodb - 关于 ArangoDB 中多索引的使用

转载 作者:行者123 更新时间:2023-12-01 23:42:02 28 4
gpt4 key购买 nike

具有以下结构的文档:

{
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 字段上有一个非稀疏 skiplist 索引 + 在 disabled 上有一个稀疏索引,在 path 上有一个全文非稀疏索引? ArangoDB 是否能够为这些类型的查询使用多个索引?我阅读了关于索引使用的文档页面,但我仍然不清楚。

最佳答案

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

对于您的查询,您有三个条件与逻辑和组合,后者包含一个

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

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进行相等比较,然后您可以在 path 上创建组合跳表索引和 enabled ,而且它可能会相当有选择性。如果你的STARTS WITH前缀总是相同的大小,将前缀保存在一个额外的属性中可能是值得的,可以索引而不是原始值并使用相等比较查询:e.pathPrefix == @prefix && e.enabled <= @timestamp .这需要为每个文档保存和维护一个额外的前缀属性,但在允许使用更具选择性的索引时,这可能是值得的。

关于arangodb - 关于 ArangoDB 中多索引的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com