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

标签 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 索引。有什么办法可以提高这个查询的速度吗?

最佳答案

我没有看到任何具体解释为什么这个查询很慢的内容,但我确实看到可以使用 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/

相关文章:

php - 拒绝用户访问

mysql - 通过 id 获取精确值的 SQL 内连接问题

linux - 确定进程花费时间等待的系统调用或子系统

c++ - 将 A[i][j] 更改为 A[j][i] 时,遍历矩阵的速度变慢

oracle - 如何在 Oracle 相关子查询连接中使用别名?

MySQL:为什么子查询中的 where 子句对另一个子查询的结果不起作用?

php - 措辞棒球盒分数

mysql - 代表单个食品订单中的多个菜肴的最佳数据结构/数据库架构是什么?

java - 使用drawRect时图形太慢

sql - Oracle:EXISTS 如何限制行数?