2014-01-20 3 views
0

При работе с помощью следующего запроса на MySQL, его получение заблокирован,Как оптимизировать этот набор запросов?

SELECT event_list.* 
FROM event_list 
    INNER JOIN members 
     ON members.profilenam=event_list.even_loc 
WHERE (even_own IN (SELECT frd_id 
        FROM network 
        WHERE mem_id='911' 
        GROUP BY frd_id) 
      OR even_own = '911') 
     AND event_list.even_active = 'y' 
GROUP BY event_list.even_id 
ORDER BY event_list.even_stat ASC 

Внутренний запрос внутри IN ограничения имеет много frd_id, поэтому из-за того, что выше запрос slooow ... Так, пожалуйста, помогите.

Спасибо.

+0

Возможно также добавить EXPLAIN. – Mihai

ответ

0

Попробуйте это:

SELECT el.* 
FROM event_list el 
INNER JOIN members m ON m.profilenam = el.even_loc 
WHERE el.even_active = 'y' AND 
    (el.even_own = 911 OR EXISTS (SELECT 1 FROM network n WHERE n.mem_id=911 AND n.frd_id = el.even_own))  
GROUP BY el.even_id 
ORDER BY el.even_stat ASC 
+0

Thnx saharsh shah – JAY

+0

@JAY Вы больше всего приветствуетесь –

0

Вам не нужен GROUP BY во внутреннем запросе, который заставит механизм базы данных делать много ненужной работы.

0

Если вы положили even_own = '911' перед select from network, то если even_own IS 911, то ему не нужно делать подзапрос. Также у вас есть group by в подзапросе?

Также запустить explain plan наверх узнать, что занимает время.

0

Это может работать лучше:

 
     (SELECT e.* 
      FROM event_list AS e 
      INNER JOIN members AS m ON m.profilenam = e.even_loc 
      JOIN network AS n ON e.even_own = n.frd_id 
      WHERE n.mem_id = '911' 
       AND e.even_active = 'y' 
      ORDER BY e.even_stat ASC) 
    UNION DISTINCT 
     (SELECT e.* 
      FROM event_list AS e 
      INNER JOIN members AS m ON m.profilenam = e.even_loc 
      WHERE e.even_own = '911' 
       AND e.even_active = 'y') 
    ORDER BY e.even_stat ASC 

Поскольку я не знаю, является ли JOIN и один-ко-многим (или что), я бросил в DISTINCT, чтобы избегать дублирования. Там может быть лучший способ, или это может быть ненужным (то есть UNION ALL).

Обратите внимание, как избежать двух вещей, которые являются производительность убийцы:

  • ИЛИ - превратился в UNION
  • IN (SELECT ...) - превратился в JOIN.

Я сделал псевдонимы, чтобы вырубить беспорядок. Я переместил ORDER BY за пределы UNION (и добавил parens, чтобы он работал правильно).

Смежные вопросы