【问题标题】:On multiple index usage in ArangoDB关于 ArangoDB 中的多个索引使用
【发布时间】:2016-02-23 20:41:47
【问题描述】:

具有以下结构的文档:

{
  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 是否能够为这些类型的查询使用多个索引?我阅读了有关索引使用的文档页面,但我仍然不清楚。

【问题讨论】:

    标签: arangodb


    【解决方案1】:

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

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

    AQL 中没有 STARTS WITH 谓词,但您可以使用使用前缀边界构造的范围查询:e.path &gt;= @lower &amp;&amp; e.path &lt; @upper。对于"somePrefix" 的搜索值,边界将转换为@upper,即"somePrefix", and@lowerbeing"somePrefiy"`(最后一个字符的搜索值加一)。

    path 上创建一个skiplist 索引将使查询使用该索引。

    包括enabled的搜索条件,到现在的组合条件是e.path &gt;= @lower &amp;&amp; e.path &lt; @upper &amp;&amp; e.enabled &lt;= @timestamp。虽然可以在多个属性上创建跳过列表索引,但它不会在pathenabled 上使用,而仅在path 上使用。颠倒索引属性的顺序(即首先是enabled,然后是path)也无济于事,因为这样索引将仅用于enabled,而不是path

    一般来说,skiplist 索引将用于可以产生连续范围的条件部分。如果最左边的索引属性用于相等比较(例如e.path == @path &amp;&amp; e.enabled &lt;= @timestamp 会起作用),但如果它最左边的索引属性是不相等比较(例如e.path &gt;= @lower &amp;&amp; e.path &lt;= @upper@e.enabled &lt;= @timestamp),那么它不会查看其进一步的索引属性,因为无论如何它都会产生一个不连续的范围。

    还可以选择在disabled 上创建跳过列表索引。这允许优化器在部件e.enabled &lt;= @timestamp &amp;&amp; (e.disabled == null || @timestamp &lt; e.disabled) 上使用该索引。它可以将其转换为e.disabled == null || @timestamp &lt; e.disabled,但看起来不是很有选择性。

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

    【讨论】:

    • 非常感谢您这么详细的回答!我想我会稍微修改一下架构,所以也许我可以想出一些更方便的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多