0

以下のクエリは約0.3秒かかります。なんで?そして、どうすればそれを解決できますか。そんなに時間がかかるべきではない...

SELECT tshops.OfficialName
 , tresults.StartTime
 , tresults.Price
 , tresults.shopID
FROM
 tresults
INNER JOIN tshops
ON tshops.shopID = tresults.shopID
WHERE
  tresults.pID = 15
  AND tresults.websiteID = 1
  AND tresults.StartTime = (SELECT max(tresults.StartTime) AS maxstarttime
                        FROM
                          tresults
                        WHERE
                          tshops.shopID = tresults.shopID
                          AND tresults.pID = 15
                          AND tresults.websiteID = 1)
ORDER BY
  tresults.Price DESC

結果を説明する:

1, PRIMARY, tshops, ALL, PRIMARY, , , , 203, Using temporary; Using filesort
1, PRIMARY, tresults, eq_ref, PRIMARY,idxPID,idxWebsite,idxStartTimeASC,idxStartTimeDESC,fk_shopID, PRIMARY, 20, func,const,pricegrabber.tshops.shopID,const, 1, Using where
2, DEPENDENT SUBQUERY, tresults, ref, idxPID,idxWebsite,fk_shopID, fk_shopID, 4, pricegrabber.tshops.shopID, 891, Using where; Using index

したがって、tshopの全表スキャンが実行されます。しかし、なぜ?両方のテーブルのshopIDにインデックスがあります...

4

1 に答える 1

0

外側の選択を参照する副選択は混乱を招く問題だと思います。

shopIDでGROUPBYを使用して、副選択に対して結合を実行してみてください。通常、MySQLはとにかくこれを行うために物事を最適化することを期待しますが、試してみる価値があります。

このようなもの(タイプミスは許してください)

SELECT tshops.OfficialName
 , tresults.StartTime
 , tresults.Price
 , tresults.shopID
FROM  tresults
INNER JOIN tshops
ON tshops.shopID = tresults.shopID
INNER JOIN (SELECT shopID, MAX(tresults.StartTime) AS MaxStartTime 
            FROM tresults 
            WHERE tresults.pID = 15 
            AND tresults.websiteID = 1 
            GROUP BY shopID) Sub1
ON tresults.StartTime = Sub1.MaxStartTime
WHERE
  tresults.pID = 15
  AND tresults.websiteID = 1
ORDER BY
  tresults.Price DESC
于 2012-10-11T10:48:30.893 に答える