gpt4 book ai didi

mysql - 为什么 MySQL 卡在这个简单的子查询上?

转载 作者:行者123 更新时间:2023-11-28 23:12:38 25 4
gpt4 key购买 nike

我有这个简单的查询,它在大约 5 秒内运行并返回大约 500 条记录,但是为什么我尝试在复合语句中使用它 MySQL 只是挂起

SELECT DISTINCT ARTIST_ID FROM WORK
GROUP BY ARTIST_ID
HAVING AVG(WORK_MILLIS_VIEWED) > 10

然而,下面的查询永远不会终止。根据进程列表,它只是在创建一个临时表,即使它只比子查询运行的时间稍长,因为艺术家表非常小。

SELECT ARTIST_NAME FROM ARTIST
WHERE ARTIST_ID IN (SELECT DISTINCT ARTIST_ID
FROM WORK GROUP BY ARTIST_ID
HAVING AVG(WORK_MILLIS_VIEWED) > 10)

我犯了一个愚蠢的错误吗?数据库似乎没有做任何其他事情。

最佳答案

MySQL 在 WHERE 子句中很难处理子查询。它通常会决定多次运行子查询(针对您与子查询比较的每个不同的 ARTIST_ID 值运行一次),即使您和我都知道子查询不会更改。

解决方法是在 FROM 子句中运行子查询并加入它:

SELECT A.ARTIST_NAME 
FROM (
SELECT ARTIST_ID FROM WORK
GROUP BY ARTIST_ID HAVING AVG(WORK_MILLIS_VIEWED) > 10
) AS T
JOIN ARTIST A ON A.ARTIST_ID = T.ARTIST_ID

这将至少运行一次子查询,并在它连接到另一个表实例时将其存储在一个临时表中。

您还将受益于按顺序排列的 (ARTIST_ID, WORK_MILLIS_VIEWED) 列对的索引。

关于mysql - 为什么 MySQL 卡在这个简单的子查询上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com