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

Hvordan optimerer man denne MySQL-forespørgsel? Millioner af rækker

Jeg ville oprette følgende indekser (b-tree indekser):

analytics(user_id, source, id) 
transactions(analytics, status)

Dette er forskelligt fra Gordons forslag.

Rækkefølgen af ​​kolonner i indekset er vigtig.

Du filtrerer efter specifik analytics.user_id , så dette felt skal være det første i indekset. Så grupperer du efter analytics.source . For at undgå sortering efter source dette bør være det næste felt i indekset. Du henviser også til analytics.id , så det er bedre at have dette felt som en del af indekset, sæt det sidst. Er MySQL i stand til kun at læse indekset og ikke røre bordet? Jeg ved det ikke, men det er ret nemt at teste.

Indeks over transactions skal starte med analytics , fordi det ville blive brugt i JOIN . Vi har også brug for 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 


  1. hvordan man indsætter HTML-kode i DB ved hjælp af php

  2. Tjek ikke-sendt e-mail i SQL Server (T-SQL)

  3. Hvad er meningen med SELECT ... FOR XML PATH(' '),1,1)?

  4. Hvordan viser man mysql blob-billede i html ved hjælp af Vuejs?