2011-03-16 174 views
1
SELECT a.FundIDRecv,a.SubscribeDt, b.FundName, 
(
    SELECT SUM(c.PricePerWeek) 
    FROM tbl_Hive c 
    WHERE c.FundID IN 
    (
     SELECT FundID from tbl_FundStatic 
     WHERE FundID IN 
     (
      SELECT FundIDSend 
      FROM tbl_FundSubscriptions 
      WHERE FundIDRecv = a.FundIDRecv 
      AND SubscribeDt >= subdate(CURDATE(), INTERVAL weekday(CURDATE()) DAY) 
     ) 
     AND UserID = '14' 
    ) 
) as Price 
FROM tbl_FundSubscriptions a, tbl_Hive b 
WHERE a.FundIDRecv = b.FundID 
AND a.SubscribeDt >= subdate(CURDATE(), INTERVAL weekday(CURDATE()) DAY) 
AND a.FundIDRecv IN 
(
    SELECT FundIDRecv 
    FROM tbl_FundSubscriptions 
    WHERE FundIDSend IN (
     SELECT FundID 
     FROM tbl_FundStatic 
     WHERE UserID = '14' 
    ) 
) 
GROUP BY FundIDRecv 

此查詢需要大量時間來獲取數據。MySQL:查詢優化

如何優化此查詢以使其執行並獲取結果的速度比它快?

+0

取決於。你的表和索引是什麼?這是一個很大的區別。 – 2011-03-16 11:04:22

+0

指出查詢應該做什麼。 – Pentium10 2011-03-16 11:12:06

+0

請給出您的查詢的數據庫結構(表/索引)和執行計劃(解釋) – oryol 2011-03-16 11:25:59

回答

3

JOIN子句替換您的嵌套選擇。藉此例如:

AND a.FundIDRecv IN 
(
    SELECT FundIDRecv 
    FROM tbl_FundSubscriptions 
    WHERE FundIDSend IN (
     SELECT FundID 
     FROM tbl_FundStatic 
     WHERE UserID = '14' 
    ) 
) 

爲什麼不加入tbl_FundStatic像這樣

FROM tbl_FundSubscriptions a 
JOIN tbl_FundStatic s ON (a.FundIDSend = s.FundID) 
WHERE s.UserID = '14' 

當然外部查詢,我不知道這是否仍然是正確的,但它會給你一個主意。此外,您應該避免SELECT子句本身的嵌套選擇。這是更好地從它

+0

我該怎麼做?你能提供更多關於如何做到這一點的信息嗎?我不知道它 – 2011-03-16 11:05:11

+0

是的,我會嘗試。感謝您的輸入。 – 2011-03-16 11:08:30

3

未經測試加入tbl_FundStatic然後選擇字段,但是這會給你一展身手:

SELECT a.fundidrecv, 
     a.subscribedt, 
     b.fundname, 
     SUM(b.priceperweek) AS price 
FROM tbl_fundsubscriptions a 
     JOIN tbl_hive b 
     ON a.fundidrecv = b.fundid 
     JOIN tbl_fundsubscriptions fs 
     ON fs.fundidrecv = a.fundidrecv 
     JOIN tbl_fundstatic fst 
     ON fst.fundid = fs.fundidsend 
      AND fst.userid = '14' 
WHERE a.subscribedt >= SUBDATE(Curdate(), INTERVAL Weekday(Curdate()) DAY) 
GROUP BY a.fundidrecv 

您需要在以下幾列添加索引:

  • (一個。 fundidrecv,a.subscribedt)
  • (b.fundid)
  • (fs.fundidrecv)
  • (fst.f undid,fst.userid)
+0

我會盡快檢查並回復您。 – 2011-03-16 11:25:23

+1

+1努力......我懶得一路走下去:-) – 2011-03-16 11:25:59

+0

@ Pentuim10:感謝您的輸入。我感謝你的努力,但SUM(b.priceperweek)顯示錯誤的數據。它沒有顯示預期的結果。 – 2011-03-16 11:33:33