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

时间:2015-05-02 23:50:06

标签: mysql performance correlated-subquery mysql-dependent-subquery

我正在使用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是主键,nodes.parent上有BTREE索引。有没有办法可以提高这个查询的速度?

1 个答案:

答案 0 :(得分: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>'

我不知道为什么您的示例查询速度很慢,但只要正确的字段被编入索引,这个结构就不会造成性能问题,当然这取决于提取的行数。