2013-05-17 3 views
0

У меня есть следующий запрос MySQL.Как оптимизировать MySQL-запрос с SUM (условие)

SELECT user_id 
     SUM(reached = 'Y') AS reached_count, 
     SUM(reached = 'N') AS not_reached_count 
    FROM goals 
GROUP BY user_id 

В настольных целях у меня около 2 миллионов записей. Выполнение запроса занимает около 45 секунд.

Тяжелая часть, кажется, SUM(reached = 'Y'), которая занимает довольно много времени. Я сравнил его с COUNT(*), который был на самом деле гораздо быстрее, но не было различий между Y и N.

EDIT: reached имеет тип ENUM('Y','N')

ответ

0

тяжелая часть является GROUP BY user_id особенно если у вас есть много пользователей, так я предлагаю добавить ORDER BY NULL, который поможет немного, вы можете прочитать больше here

2

попробуйте добавить индекс user_id, reached, затем повторите запрос:

SELECT user_id, reached, count(*) 
FROM goals 
GROUP BY user_id, reached 
+0

+1 это так очевидно, и я пропустил это ... и если он хочет, чтобы данные поворачивались, он мог сделать это, используя это в качестве вспомогательного запроса. – Stephan

+0

Попробовали, но этот запрос был еще медленнее. Я создал индекс для обоих полей. – Aley

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