2011-03-16 4 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 절로 대체하십시오. 이 아직도 맞다면, 내가 모르는 물론이

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

같은 외부 쿼리에

AND a.FundIDRecv IN 
(
    SELECT FundIDRecv 
    FROM tbl_FundSubscriptions 
    WHERE FundIDSend IN (
     SELECT FundID 
     FROM tbl_FundStatic 
     WHERE 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)이 잘못된 데이터를 표시하고 있습니다. 예상 결과가 표시되지 않습니다. –