Vytvořil bych následující indexy (indexy b-stromu):
analytics(user_id, source, id)
transactions(analytics, status)
To se liší od Gordonova návrhu.
Pořadí sloupců v indexu je důležité.
Filtrujete podle konkrétního analytics.user_id
, takže toto pole musí být první v indexu. Poté seskupíte podle analytics.source
. Chcete-li se vyhnout řazení podle source
toto by mělo být další pole indexu. Také odkazujete na analytics.id
, takže je lepší mít toto pole jako součást indexu, dejte ho jako poslední. Dokáže MySQL číst pouze index a nedotýkat se tabulky? Nevím, ale je to docela snadné otestovat.
Index na transactions
musí začít analytics
, protože by byl použit v JOIN
. Potřebujeme také 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