在 AQL 中,连接首先发生还是过滤器发生?
In AQL, do joins happen first or the filters?
我有 2 个集合,用户和员工,员工文档的 _id 嵌入到用户文档中。我想知道下面两种方法中哪一种更有效。
FOR employee IN employees
FOR user IN users
FILTER user.email == 'user@foo.com'
FILTER employee._id == user.employee
RETURN merge({user: user, active: employee.active})
或
FOR user IN users
FOR employee IN employees
FILTER employee._id == user.employee
FILTER user.email == 'user@foo.com'
RETURN merge({user: user, active: employee.active})
在你的情况下没关系。查询将从数据库执行计划程序自动优化并重写为类似于以下内容的查询。
FOR employee IN employees
FILTER user.email == 'user@foo.com'
FOR user IN users
FILTER employee._id == user.employee
RETURN merge({user: user, active: employee.active})
您可以在 query
选项卡中使用按钮 explain
检查如何通过 webUI 优化查询。它将为您打印执行计划,您还可以在其中查看使用了哪些索引以及查询的每个部分花费了多少。这是一个非常强大的工具。
如果您想了解更多关于查询执行和性能的信息,您应该查看 docs。
我有 2 个集合,用户和员工,员工文档的 _id 嵌入到用户文档中。我想知道下面两种方法中哪一种更有效。
FOR employee IN employees
FOR user IN users
FILTER user.email == 'user@foo.com'
FILTER employee._id == user.employee
RETURN merge({user: user, active: employee.active})
或
FOR user IN users
FOR employee IN employees
FILTER employee._id == user.employee
FILTER user.email == 'user@foo.com'
RETURN merge({user: user, active: employee.active})
在你的情况下没关系。查询将从数据库执行计划程序自动优化并重写为类似于以下内容的查询。
FOR employee IN employees
FILTER user.email == 'user@foo.com'
FOR user IN users
FILTER employee._id == user.employee
RETURN merge({user: user, active: employee.active})
您可以在 query
选项卡中使用按钮 explain
检查如何通过 webUI 优化查询。它将为您打印执行计划,您还可以在其中查看使用了哪些索引以及查询的每个部分花费了多少。这是一个非常强大的工具。
如果您想了解更多关于查询执行和性能的信息,您应该查看 docs。