我正在使用 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 索引。有什么办法可以提高这个查询的速度吗?
最佳答案
我没有看到任何具体解释为什么这个查询很慢的内容,但我确实看到可以使用 JOIN 而不是子查询来重组它。像这样的东西(我已经颠倒了表别名,因为这就是我的大脑的工作方式):
SELECT MAX(n2.someValue) AS `rate`
FROM `nodes` n1
JOIN `nodes` n2 ON n1.descendant = n2.id
WHERE n1.parent = '<some static id>'
我不知道为什么您的示例查询很慢,但只要对正确的字段建立索引,并且当然取决于要获取的行数,这种结构就不会造成性能问题。
关于mysql - 如何提高具有不依赖子查询的 MySQL 查询的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30008751/