【问题标题】:Does the order of FILTER statement affect the performance of query in arangoDB?FILTER 语句的顺序是否会影响 arangoDB 中查询的性能?
【发布时间】:2018-11-02 11:48:33
【问题描述】:

比如我有这个数据结构

{
easyFilter:1111,
hardFilter:[
 {id:1},
 {id:2},
...
]
}

如果我使用的查询是这样的

For u in collection
Filter u.easyFilter=1111 AND "somevalue" IN FLATTEN(u.hardFilter[*].id)
return u

如果我将 easyFilter 放在首位,查询会运行得更快吗,因为它只是在对象的第一级进行字符串比较,或者在 arango 中无关紧要?

【问题讨论】:

    标签: database performance arangodb aql


    【解决方案1】:

    是的,FILTER 语句的顺序确实会影响查询的性能。

    尤其是在你的情况下,

    easyFilter只是字符串比较,

    hardFilter 是由多个操作构成的

    1. 迭代数组 + 获取已定义键的值
    2. 展平该数组
    3. 检查数组是否包含定义的值

    省略的是索引的重要性。他们是真正执行查询背后的人。在ArangoDB documentation 中查看Handling Indexes,尤其是Which Index to use when

    为了提高示例的性能,添加HashSkiplist 索引easyFilter 肯定会有所帮助(取决于数据的类型/唯一性)。这两个索引也支持数组,但基于文档,它仅适用于包含值的简单数组,而不是对象。

    【讨论】:

    • 您可以创建索引hardFilter[*].id 并在查询中执行FILTER 1234 IN u.hardFilter[*].id(不需要FLATTEN())以利用散列或跳过列表索引。它将匹配至少具有给定 ID、嵌套在 hardFilter 属性中的任何文档。请注意,优化器不能将跳过列表索引与范围比较(目前)结合使用,例如 FILTER u.hardFilter[*].id ALL >= 1234
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多