MySQL优化使用WHERE子句的子查询?

MySQL优化使用WHERE子句的子查询?,mysql,Mysql,在我的查询中,我使用一个子查询来获取给定产品的报价的第二个最后最高日期 这是我的子查询: LEFT JOIN (SELECT product_id, MAX(offer_date) AS sec_last_date FROM t_offers AS s1 WHERE offer_date < (SELECT MAX(offer_date) FROM t_offers

在我的查询中,我使用一个子查询来获取给定产品的报价的第二个最后最高日期

这是我的子查询:

LEFT JOIN (SELECT product_id, MAX(offer_date) AS sec_last_date 
           FROM t_offers AS s1  
           WHERE offer_date < (SELECT MAX(offer_date)
                               FROM t_offers 
                               WHERE product_id=s1.product_id)
           GROUP BY product_id) AS t2 ON t2.product_id=p.id 
LEFT JOIN t_offers AS o2 ON o2.product_id=t2.product_id AND 
                            o2.offer_date=t2.sec_last_date
它工作得很好,但目前t_表中只有几行

由于WHERE子句迫使MySQL为每个产品id迭代t_provides表,因此它可能无法很好地处理数千行或数百万行


如何优化此子查询

你就不能对报价日期进行排序,然后得到最新的报价,比如:

select product_id, offer_date
from your table
order by offer_Date desc
limit 2

在MySQL中,子查询通常不是很好,因为没有为连接使用索引

但是,尝试带有联接的子查询,而不是带有子查询的子查询,可能是值得的:-

LEFT JOIN (SELECT s1.product_id, MAX(s1.offer_date) AS sec_last_date 
           FROM t_offers AS s1  
           INNER JOIN t_offers AS s2
           ON s2.product_id = s1.product_id
           AND s2.offer_date > s1.offer_date
           GROUP BY s1.product_id) AS t2 ON t2.product_id=p.id 

我不知道这是否真的像你说的那样有效。例如,这没有意义product\u id=s1.product\u id,因为它与product\u id=product\u id相同。如果是真的,我可以删除product\u id=product\u id并得到相同的结果。但是我的子查询中仍然有一个WHERE,所以pb保持不变。听起来很棒!我没有想到在左连接的子查询中放置一个内部连接。这样WHERE子句问题似乎就解决了。