sql >> Database >  >> RDS >> Mysql

Hoe deze MySQL-query optimaliseren? Miljoenen rijen

Ik zou de volgende indexen maken (b-tree indexen):

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

Dit is anders dan Gordons suggestie.

De volgorde van kolommen in de index is belangrijk.

U filtert op specifieke analytics.user_id , dus dit veld moet het eerste in de index zijn. Vervolgens groepeert u op analytics.source . Sorteren op source vermijden dit zou het volgende veld van de index moeten zijn. Je verwijst ook naar analytics.id , dus het is beter om dit veld als onderdeel van de index als laatste te plaatsen. Kan MySQL alleen de index lezen en de tabel niet aanraken? Ik weet het niet, maar het is vrij eenvoudig te testen.

Index op transactions moet beginnen met analytics , omdat het zou worden gebruikt in de JOIN . We hebben ook status nodig .

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. Hoe JDBC-configuratie te laden vanuit het eigenschappenbestand Voorbeeld

  2. Python:mysqldb gebruiken om een ​​MySQL-tabel als woordenboek te importeren?

  3. MySQL:Selecteer vorige maand en maand ervoor

  4. Zoeken in Microsoft SQL Server-database naar opgeslagen gegevens