Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottimizzare questa query MySQL? Milioni di righe

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