Jag skulle skapa följande index (b-tree index):
analytics(user_id, source, id)
transactions(analytics, status)
Detta skiljer sig från Gordons förslag.
Ordningen av kolumner i indexet är viktig.
Du filtrerar efter specifik analytics.user_id
, så det här fältet måste vara det första i indexet. Sedan grupperar du efter analytics.source
. För att undvika sortering efter source
detta bör vara nästa fält i indexet. Du refererar också till analytics.id
, så det är bättre att ha detta fält som en del av indexet, lägg det sist. Kan MySQL bara läsa indexet och inte röra bordet? Jag vet inte, men det är ganska lätt att testa.
Index på transactions
måste börja med analytics
, eftersom det skulle användas i JOIN
. Vi behöver också 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