2011-03-16 18 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

に依存します。あなたのテーブルとインデックスは何ですか?それは大きな違いになります。 –

+0

クエリが何をするかを指示します。 – Pentium10

+0

クエリのDB構造(テーブル/インデックス)と実行計画(説明)を教えてください – oryol

答えて

3

ネストされた選択をJOIN句で置き換えます。例えばこれを持っ:

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

理由だけではなく、当然のことながら、この

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

のような外部クエリにtbl_FundStaticに参加していない、これはまだ正しいかどうかは分かりませんが、それはあなたを与えるだろうアイデア。また、SELECT句自体にネストされた選択を避けるべきです。これは、未テストそれ

+0

どうすればいいですか?あなたはそれを行う方法についてより多くの情報を提供できますか?私はそれについて考えていない –

+0

ええ、私はそれを試してみましょう。しかし、入力をありがとう。 –

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

私はすぐにそれをチェックし、あなたに連絡します。 –

+1

+1努力のために...私はすべての道を行くにはあまりにも怠惰だった:-) –

+0

@ Pentuim10:入力していただきありがとうございます。私はあなたの努力に感謝しますが、SUM(b.priceperweek)は間違ったデータを表示しています。予想される結果は表示されません。 –