MySQL: оптимизация запросов - PullRequest
1 голос
/ 16 марта 2011
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

Этот запрос занимает огромное количество времени для извлечения данных.

Как я могу оптимизировать этот запрос, чтобы он выполнялся и получал результаты быстрее, чем он?

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Не проверено, но это поможет вам:

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 

Вам необходимо добавить индексы в следующие столбцы:

  • (a.fundidrecv, a.subscribeedt)
  • (b.fundid)
  • (fs.fundidrecv)
  • (fst.fundid, fst.userid)
3 голосов
/ 16 марта 2011

Замените ваши вложенные выборки на 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.Лучше присоединиться к tbl_FundStatic, а затем выбрать из него поля

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...