sql >> Databasteknik >  >> RDS >> Mysql

Hur optimerar man denna MySQL-fråga? Miljontals rader

Jag skulle skapa följande index (b-tree index):

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

Detta skiljer sig från Gordons förslag.

Ordningen av kolumner i indexet är viktig.

Du filtrerar efter specifik analytics.user_id , så det här fältet måste vara det första i indexet. Sedan grupperar du efter analytics.source . För att undvika sortering efter source detta bör vara nästa fält i indexet. Du refererar också till analytics.id , så det är bättre att ha detta fält som en del av indexet, lägg det sist. Kan MySQL bara läsa indexet och inte röra bordet? Jag vet inte, men det är ganska lätt att testa.

Index på transactions måste börja med analytics , eftersom det skulle användas i JOIN . Vi behöver också 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. MySQL-uppdatering första instans av en post

  2. Jämför MariaDB Server med MariaDB Cluster

  3. Databasversion / Ändringskontroll för data inte schema?

  4. Finns det något som liknar en split()-metod i mySql?