Ik zou de volgende indexen maken (b-tree indexen):
analytics(user_id, source, id)
transactions(analytics, status)
Dit is anders dan Gordons suggestie.
De volgorde van kolommen in de index is belangrijk.
U filtert op specifieke analytics.user_id
, dus dit veld moet het eerste in de index zijn. Vervolgens groepeert u op analytics.source
. Sorteren op source
vermijden dit zou het volgende veld van de index moeten zijn. Je verwijst ook naar analytics.id
, dus het is beter om dit veld als onderdeel van de index als laatste te plaatsen. Kan MySQL alleen de index lezen en de tabel niet aanraken? Ik weet het niet, maar het is vrij eenvoudig te testen.
Index op transactions
moet beginnen met analytics
, omdat het zou worden gebruikt in de JOIN
. We hebben ook status
nodig .
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