如何过滤联接的字段? (性能问题)

时间:2019-05-30 19:43:16

标签: arangodb aql

先决条件

我用两个生成的集合创建了数据库:用户和注释。每个都包含约100万个文档。

以下是结构:

用户:(name字段使用跳过列表索引):

{
    "name": "Some user name"
}

注释:(authors字段包含_key集合中文档的users个):

{
    "title": "Some title",
    "authors": [
        "12345", "12346", "12347", ...
    ]
}

问题

我需要在users字段中加入authors集合,然后按用户name进行过滤,但这花费的时间太长。在我当地大约是3.5秒。 Specific name值仅出现一次。

let specificUsers = (
    for user in users
        filter user.name == 'Specific name'
        return user
)

for note in notes

    let authors = (
        for user in specificUsers
            filter user._key in (note.authors != null ? note.authors : [])
            return user
    )

    filter count(authors) > 0


//    filter 'Specific name' in (authors[*].name) // this way takes even longer

    limit 10

    return merge(note, {
        authors: authors
    })

如果我省略了count过滤器或对“自有”属性进行过滤,那么它的加载速度当然很快。但实际上需要对联接的集合进行过滤。就像在关系数据库中一样。

问题

在这种情况下我做错了还是ArangoDB表现不佳?

如果需要提供更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

所以,我错过了两件事:

  • 我没有在authors[*]上添加索引。
  • 我正在使用(note.authors != null ? note.authors : [])。 (我想,最好确保authors属性始终是数组)