2

我正在使用 MySQL 中的一个表,该表使用“邻接列表”方法定义树层次结构,这对我的目的来说应该没问题。

我需要使用(快速)查询计算所有孩子的某个值的最大值

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

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

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>);

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

4

1 回答 1

3

我没有看到任何具体解释为什么这个查询很慢的东西,但我确实看到可以使用 JOIN 而不是子查询对其进行重组。像这样的东西(我颠倒了表格别名,因为我的大脑就是这样工作的):

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

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

于 2015-05-03T00:42:20.203 回答