sql >> Database >  >> RDS >> Mysql

Correcte indexering door Join-Where-Group Door selectiequery's te vermijden Tijdelijk gebruiken; Bestandssorteren gebruiken

Ik zou de vraag als volgt schrijven:

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

Ik zou zeker een index hebben op cell met time als de leidende kolom.

MySQL kan dezelfde index gebruiken om te voldoen aan het bereikpredikaat (in de WHERE-component) en om te voldoen aan de GROUP BY zonder een "Using filesort"-bewerking.

... ON cell (time)

Afhankelijk van de afmetingen van de kolommen kan een dekkingsindex optimale prestaties geven. Een dekkende index omvat alle kolommen uit de tabel waarnaar in de zoekopdracht wordt verwezen, zodat de zoekopdracht volledig kan worden vervuld vanaf indexpagina's zonder dat er naar pagina's in de onderliggende tabel hoeft te worden gezocht.

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

Voor de index op swap_plan , ik zou een index hebben met site_id als de leidende kolom, en inclusief de clustername kolom, een van de volgende:

... ON swap_plan (clustername, site_id)

of

... ON swap_plan (site_id, clustername)

Het lijkt waarschijnlijk dat er een UNIEKE beperking zal zijn voor de combinatie van die twee kolommen, d.w.z. de waarden van site_id zal verschillend zijn voor een gegeven clustername . (Als dat niet het geval is, en hetzelfde (site_id,clustername) tuple verschijnt meerdere keren, er is potentieel voor een totaal van counter op te blazen.

Ik zou op zoek zijn naar de EXPLAIN output om een ​​'ref' lookup te tonen naar swap_plan tabel uit de waarde van c.siteid en const (letterlijk 'Cluster A') waarde voor clusternaam.

Met tabellen met een grootte van 31 rijen en 368 rijen, zullen we geen significant verschil in prestaties (verstreken tijd) zien tussen een optimaal uitvoeringsplan en een vreselijk uitvoeringsplan.

Wanneer een van de tabellen wordt opgeschaald naar miljoenen rijen, worden de verschillen duidelijk. De keuze van de optimalisatie voor het uitvoeringsplan wordt beïnvloed door statistieken (grootte, aantal rijen, kolomkardinaliteit) van elke tabel, dus het uitvoeringsplan kan veranderen als de tabel groter wordt.




  1. 4 manieren om een ​​lijst met schema's te krijgen in SQL Server Agent (T-SQL)

  2. Hoe om te gaan met meerdere opzoektabellen voor beginners van SQL?

  3. hoe te ontsnappen aan speciale tekens in mysql jdbc-verbindingsreeks

  4. Bepaal de rangorde op basis van meerdere kolommen in MySQL