Creerei i seguenti indici (indici b-tree):
analytics(user_id, source, id)
transactions(analytics, status)
Questo è diverso dal suggerimento di Gordon.
L'ordine delle colonne nell'indice è importante.
Filtri per analytics.user_id
specifico , quindi questo campo deve essere il primo nell'indice. Quindi raggruppi per analytics.source
. Per evitare l'ordinamento per source
questo dovrebbe essere il campo successivo dell'indice. Fai riferimento anche a analytics.id
, quindi è meglio avere questo campo come parte dell'indice, mettilo per ultimo. MySQL è in grado di leggere solo l'indice e non toccare la tabella? Non lo so, ma è piuttosto facile da testare.
Indice sulle transactions
deve iniziare con analytics
, perché verrebbe utilizzato nel JOIN
. Abbiamo anche bisogno di 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