Бих създал следните индекси (индекси на b-дърво):
analytics(user_id, source, id)
transactions(analytics, status)
Това е различно от предложението на Гордън.
Редът на колоните в индекса е важен.
Филтрирате по конкретен analytics.user_id , така че това поле трябва да е първото в индекса. След това групирате по analytics.source . За да избегнете сортиране по source това трябва да е следващото поле на индекса. Позовавате се също на analytics.id , така че е по-добре това поле да е част от индекса, поставете го последно. Може ли MySQL да чете само индекса и да не докосва таблицата? Не знам, но е доста лесно за тестване.
Индекс на transactions трябва да започне с analytics , защото ще се използва в JOIN . Нуждаем се и от status .
SELECT
analytics.source AS referrer,
COUNT(analytics.id) AS frequency,
SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094
GROUP BY analytics.source
ORDER BY frequency DESC
LIMIT 10