如何提高具有非依赖子查询的 MySQL 查询的性能?

How do I improve the performance of a MySQL query that has a dependent subquery that isn't?

我正在使用 MySQL 中的 table,它使用 "adjacency list" 方法定义树层次结构,这对我的目的来说应该没问题。

我需要使用(快速)查询

计算所有 children 中某个值的最大值
SELECT MAX(N.someValue) AS rate
FROM `nodes` N
WHERE N.parent = <some node id>;

有时我没那么幸运,不得不与 children 的后代一起工作(它已定义,并且总是引用该树分支中的某个叶节点)。

SELECT MAX(N.someValue) AS rate
FROM `nodes` N
WHERE N.id IN (SELECT N2.descendant FROM `nodes` N2 WHERE N2.parent = <some node id>);

第二个查询很慢。给定 parent 的 children 的数量非常少,很少超过 10 个,从不超过 20 个。在我看来,它似乎不是相关的子查询,尽管 EXPLAIN 说子查询是依赖的.我正在 MySQL 5.1 中进行测试。 nodes.id是主键,nodes.parent上有一个BTREE索引。有什么办法可以提高这个查询的速度吗?

我没有看到任何具体解释此查询为何缓慢的内容,但我确实看到可以使用 JOIN 而不是子查询对其进行重组。像这样(我已经颠倒了 table 别名,因为我的大脑就是这样工作的):

SELECT MAX(n2.someValue) AS `rate`
FROM `nodes` n1
JOIN `nodes` n2 ON n1.descendant = n2.id
WHERE n1.parent = '<some static id>'

我不知道为什么你的示例查询很慢,但只要正确的字段被索引并且当然取决于正在获取的行数,这种结构应该不会造成性能问题。