1

我有一个嵌套查询的严重问题,我怀疑 MySQL 将其解释为相关子查询,而实际上它应该是不相关的。该查询跨越两个表,一个是产品列表,另一个是它们在不同时间点的价格。我的目标是返回价格范围始终高于某个值的产品的每条价格记录。我的查询如下所示:

SELECT oP.id, oP.title, oCR.price, oC.timestamp
FROM Crawl_Results AS oCR
        JOIN Products AS oP 
            ON oCR.product = oP.id
        JOIN Crawls AS oC 
            ON oCR.crawl = oC.id
WHERE oP.id
IN (
    SELECT iP.id
    FROM Products AS iP
            JOIN Crawl_Results AS iCR 
               ON iP.id = iCR.product
    WHERE iP.category =2
    GROUP BY iP.id
    HAVING (
              MAX( iCR.price ) - MIN( iCR.price )
           ) >1
)
ORDER BY oP.id ASC

单独来看,内部查询执行良好,并返回价格范围高于标准的产品的 id 列表。如果我在 IN 子句中提供一个简单的 id 列表,外部查询也可以正常工作。但是,当我将它们一起运行时,查询需要约 3 分钟才能返回约 1500 行,因此我认为它正在为外部的每一行执行内部查询,这并不理想。我确实在内部和外部查询中的列别名相同,所以我认为如上所述在内部和外部对它们进行不同的别名可以解决它,但事实并非如此。

关于这里发生了什么的任何想法?

4

1 回答 1

2

MySQL 可能认为它可以使用索引来更快地执行查询,方法是为每个OP.id. 首先要检查的是您的统计数据是否是最新的

您可以将 重写where ... in为过滤inner join。对于搜索,这不太可能被“优化”:

SELECT  *
FROM    Crawl_Results AS oCR
JOIN    Products AS oP 
ON      oCR.product = oP.id
JOIN    Crawls AS oC 
ON      oCR.crawl = oC.id
JOIN    (
        SELECT  iP.id
        FROM    Products AS iP
        JOIN    Crawl_Results AS iCR 
        ON      iP.id = iCR.product
        WHERE   iP.category =2
        GROUP BY 
                iP.id
        HAVING  (MAX(iCR.price) - MIN(iCR.price)) > 1
        ) filter
ON      OP.id = filter.id

另一种选择是使用临时表。您将子查询的结果存储在临时表中并加入该表。这确实迫使 MySQL 不将子查询作为相关查询执行。

于 2012-08-04T16:15:00.513 回答