FILTER 语句的顺序是否会影响 arangoDB 中的查询性能?
Does the order of FILTER statement affect the performance of query in arangoDB?
比如我有这个数据结构
{
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 中无关紧要?
是的,FILTER 语句的顺序确实会影响查询的性能。
特别是在你的情况下,
easyFilter
只是字符串比较,
而 hardFilter
是由多个操作构成的
- 迭代数组+获取定义键的值
- 展平该数组
- 检查数组是否包含定义的值
省略的是索引的重要性。他们是真正执行查询的幕后黑手。检查 Handling Indexes in ArangoDB documentation, especially Which Index to use when.
为了提高示例的性能,添加 Hash or Skiplist 索引 easyFilter 绝对有帮助(取决于数据的类型/唯一性)。这两个索引也支持数组,但根据文档,这仅适用于包含值的简单数组,而不适用于对象。
比如我有这个数据结构
{
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 中无关紧要?
是的,FILTER 语句的顺序确实会影响查询的性能。
特别是在你的情况下,
easyFilter
只是字符串比较,
而 hardFilter
是由多个操作构成的
- 迭代数组+获取定义键的值
- 展平该数组
- 检查数组是否包含定义的值
省略的是索引的重要性。他们是真正执行查询的幕后黑手。检查 Handling Indexes in ArangoDB documentation, especially Which Index to use when.
为了提高示例的性能,添加 Hash or Skiplist 索引 easyFilter 绝对有帮助(取决于数据的类型/唯一性)。这两个索引也支持数组,但根据文档,这仅适用于包含值的简单数组,而不适用于对象。