2016-10-13 2 views
0

Как я могу повысить производительность ниже запроса? Какие индексы могут помочь?MySQL индексы по запросу с предложениями Where, GroupBy и OrderBy

SELECT platform, country, Source, window, 
Round(SUM(ProjectedARPI*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPI, 
Round(SUM(ProjectedARPIOrganicLow*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicLow, 
Round(SUM(ProjectedARPIOrganicMed*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicMed, 
Round(SUM(ProjectedARPIOrganicHigh*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicHigh, 
SUM(PlayerCount) AS PlayerCount, SUM(PayerCount) AS PayerCount, 
CASE WHEN(SUM(PlayerCount) > 500 AND SUM(PayerCount) > 10) THEN TRUE ELSE FALSE END AS isSignificant, 
ProjectionDate, 
min(CohortRangeLow) as CohortRangeLow, 
max(CohortRangeHigh) as CohortRangeHigh 
FROM web_synch.UI_data 
WHERE PlayerCount > 0 AND ProjectionDate BETWEEN '2015-07-25' AND '2016-10-25' AND window = 365 
GROUP BY Platform, country, source, ProjectionDate 
ORDER BY Platform, source, ProjectionDate; 
+2

Вы можете начать с некоторой попытки форматирования запроса. Я понимаю, что вы новичок на сайте, но запрос беспорядок. Если его невозможно прочитать, его нельзя улучшить. –

+1

Спасибо, Бобский за редактирование сообщения. – Mayank

+0

мой всегда добавьте 4 пробела перед кодом – BobSki

ответ

0

Для этого запроса, в основном ваша единственная надежда в использовании индексов является: UI_data(window, ProjectionDate, PlayerCount) или UI_data(window, PlayerCount, ProjectionDate). Который лучше зависит от того, какой выбор меньше записей. , , Я бы предпочел, что первое лучше.

+0

Спасибо, Гордон за ответ! Просто хотите понять, почему здесь работает индекс для столбцов GROUP-BY? – Mayank

+0

(Pls игнорировать выше комментарий) Спасибо Гордон за ответ! Просто хотите понять, почему индекс для столбцов GROUP-BY не будет работать здесь? – Mayank

+0

Наряду с вашим предлагаемым индексом для предложения WHERE, я также добавил индекс для предложения GROUP-BY. Но когда запрос выполнялся, он использовал только индекс для предложения where, а не индекс для предложения group. – Mayank

0

Я полагаю, что это лучший показатель:

INDEX(window,   -- first because "=" 
     ProjectionDate -- range 
    )     -- nothing after range will be looked at 

Это имеет небольшое преимущество по сравнению с показателем в 3 колонки предложенный ранее, в том, что индекс будет немного меньше.

Другие обсуждения: Index cookbook.

Ожидаю, что будет два вида: один для GROUP BY, затем один для ORDER BY. Он будет работать немного быстрее, если вы сделаете ORDER BY и список GROUP BY идентичными.

Возможная ошибка: если ProjectionDate является типом данных DATE, то диапазон составляет три месяца плюс один день. Рекомендовать этот шаблон:

ProjectionDate >= '2015-07-25' 
AND ProjectionDate < '2016-07-25' + INTERVAL 3 MONTH 
+0

Спасибо Рику за отзывы. Я попробую оба ваши предложения и посмотрю улучшения. Также проверю возможную ошибку, о которой вы упомянули. – Mayank

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