0

好吧,伙计们,以下问题整天困扰着我:

我使用下面的查询来选择产品和价格的概述,包括基于另一个表(结果)中的字段 StartTime 的最新结果价格。为此,我认为我需要在连接中进行子选择。

问题是 EXPLAIN 函数告诉我 MySQL 正在扫描所有结果行(225000 行)而不使用任何索引。

有什么方法可以加快速度吗?最好通过添加 WHERE 语句让 mysql 只查看具有相应 pID 的行。

select p.pID, brandname, description, p.EAN, RetailPrice, LowestPrice, min(price), min(price)/lowestprice-1 as afwijking
from tproducts p
    join ( 
    select Max(tresults.StartTime) AS maxstarttime, tresults.pID
    from tresults
    -- maybe adding a where clause here?
    group by tresults.pID
    ) p_max on (p_max.pID = p.pID)
join tresults res on (res.starttime = p_max.maxstarttime and p.pID = res.pID and res.websiteID = 1)
join tsupplierproducts sp on (sp.pID = p.pID AND supplierID = 1)
join tbrands b on (b.brandID = p.BrandID)
group by p.pID, brandname, description, p.EAN, RetailPrice, LowestPrice

索引位于属于连接或 where 子句的所有列上。

任何帮助,将不胜感激。谢谢!

4

1 回答 1

0

根据您的 SQL,我假设您仅列出基于 1 个供应商 (supplierID = 1) 的产品。

最佳做法是在 sql 开头执行您已知的过滤器以消除记录,然后使用内部连接连接其他没有过滤器的表。

select p.pID, brandname, description, p.EAN, RetailPrice, LowestPrice, min(price), min(price)/lowestprice-1 as afwijking
from 
(select p.pID, p.BrandID p.EAN, Max(t.StartTime) AS maxstarttime
FROM tproducts p INNER JOIN tresults t on supplierID=1 and p.pID=t.pID
group by tresults.pID
) p 
inner join tresults res on (res.websiteID = 1 and p.pID = res.pID and res.starttime = p_max.maxstarttime)
inner join tsupplierproducts sp on (sp.pID = p.pID)
inner join tbrands b on (b.brandID = p.BrandID)
group by p.pID, brandname, description, p.EAN, RetailPrice, LowestPrice

从上面的代码中,我在加入结果之前从 tproducts 中消除了所有供应商ID!= 1。

让我知道上面的 sql 是否有帮助,以及 EXPLAIN 函数的结果是什么

:-)

于 2012-09-27T09:59:42.670 回答