Jeg ville oprette følgende indekser (b-tree indekser):
analytics(user_id, source, id)
transactions(analytics, status)
Dette er forskelligt fra Gordons forslag.
Rækkefølgen af kolonner i indekset er vigtig.
Du filtrerer efter specifik analytics.user_id
, så dette felt skal være det første i indekset. Så grupperer du efter analytics.source
. For at undgå sortering efter source
dette bør være det næste felt i indekset. Du henviser også til analytics.id
, så det er bedre at have dette felt som en del af indekset, sæt det sidst. Er MySQL i stand til kun at læse indekset og ikke røre bordet? Jeg ved det ikke, men det er ret nemt at teste.
Indeks over transactions
skal starte med analytics
, fordi det ville blive brugt i JOIN
. Vi har også brug for 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