如何过滤连接的字段? (性能问题)
How to filter on joined fields? (performance issues)
先决条件
我创建了包含两个生成集合的数据库:用户和注释。每个包含 ~1M 文档。
结构如下:
用户:(name
字段使用skiplist索引):
{
"name": "Some user name"
}
注意:(authors
字段包含 _key
到 users
集合中的文档:
{
"title": "Some title",
"authors": [
"12345", "12346", "12347", ...
]
}
问题
我需要在 authors
字段上加入 users
集合,然后按用户 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 在这种情况下表现不佳?
如果我需要提供更多详细信息,请告诉我。
所以,我错过了两件事:
- 我没有在
authors[*]
上添加索引。
- 我正在使用
(note.authors != null ? note.authors : [])
。 (我想,最好确保 authors
属性始终是数组)
先决条件
我创建了包含两个生成集合的数据库:用户和注释。每个包含 ~1M 文档。
结构如下:
用户:(name
字段使用skiplist索引):
{
"name": "Some user name"
}
注意:(authors
字段包含 _key
到 users
集合中的文档:
{
"title": "Some title",
"authors": [
"12345", "12346", "12347", ...
]
}
问题
我需要在 authors
字段上加入 users
集合,然后按用户 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 在这种情况下表现不佳?
如果我需要提供更多详细信息,请告诉我。
所以,我错过了两件事:
- 我没有在
authors[*]
上添加索引。 - 我正在使用
(note.authors != null ? note.authors : [])
。 (我想,最好确保authors
属性始终是数组)