Бих създал следните индекси (индекси на 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