sql >> Databasteknik >  >> RDS >> Mysql

Korrekt indexering av Join-Where-Group Genom att välja frågor undviker du att använda temporär; Använder filsortering

Jag skulle skriva frågan så här:

SELECT c.time
     , SUM(c.counter)
     , MAX(p.clustername) AS clustername
  FROM cell c

  JOIN swap_plan p
    ON p.siteid      = c.siteid
   AND p.clustername = 'Cluster A'

 WHERE c.time  >=  'day1'
   AND c.time  <=  'day2'
 GROUP
    BY c.time

Jag skulle vara säker på att ha ett index på cell med time som den ledande kolumnen.

MySQL kan använda samma index för att uppfylla intervallpredikatet (i WHERE-satsen), och för att uppfylla GROUP BY utan en "Using filesort"-operation.

... ON cell (time)

Beroende på storleken på kolumnerna kan ett täckande index ge optimal prestanda. Ett täckande index inkluderar alla kolumner från tabellen som refereras till i frågan, så frågan kan tillfredsställas helt från indexsidor utan uppslag till sidor i den underliggande tabellen.

... ON cell (time, siteid, counter)

För indexet på swap_plan , jag skulle ha ett index med site_id som den inledande kolumnen, och inklusive clustername kolumn, någon av:

... ON swap_plan (clustername, site_id)

eller

... ON swap_plan (site_id, clustername)

Det verkar troligt att det kommer att finnas en UNIK begränsning för kombinationen av dessa två kolumner, dvs värdena för site_id kommer att vara distinkt för ett givet clustername . (Om så inte är fallet, och samma (site_id,clustername) tupel visas flera gånger, det finns potential för sammanlagd summa av counter att blåsas upp.

Jag skulle leta efter EXPLAIN output för att visa en "ref"-uppslagning till swap_plan tabell från värdet för c.siteid och const (bokstavligen 'Kluster A') värde för klusternamn.

Med tabeller med 31 rader och 368 rader kommer vi inte att se någon signifikant skillnad i prestanda (förfluten tid) mellan en optimal exekveringsplan och en hemsk exekveringsplan.

När någon av tabellerna skalas upp till miljontals rader, är det då skillnaderna blir uppenbara. Optimerarens val av exekveringsplan påverkas av statistik (storlek, antal rader, kolumnkardinalitet) för varje tabell, så exekveringsplanen kan ändras med en ökning av tabellstorlekar.




  1. Hur man cachelagrar objekt skapade från MySQL-databas

  2. docker commit mysql sparar inte

  3. Java-anslut till Cloud SQL 2nd Gen från Appengine Managed VM

  4. MySql 5.7 Funktion UUID() standardsortering - Olaglig blandning av sorteringar