Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Lange Tabelle vs. breite Tabelle

Zunächst einmal sind dies zwei unterschiedliche Datenmodelle, die für unterschiedliche Zwecke geeignet sind.

Abgesehen davon würde ich erwarten, dass das zweite Modell schneller für die Aggregation ist, einfach weil die Daten kompakter gepackt sind und daher weniger I/O benötigen:

  • Das GROUP BY im ersten Modell kann durch ein vollständiges erfüllt werden scannen Sie den Index {size, price} . Die Alternative zum Index ist zu langsam, wenn die Daten zu groß sind, um in den Arbeitsspeicher zu passen.
  • Die Abfrage im zweiten Modell kann durch einen vollständigen Tabellenscan erfüllt werden. Kein Index erforderlich.

Da der erste Ansatz Tabelle + Index benötigt und der zweite nur die Tabelle, ist die Cache-Auslastung im zweiten Fall besser. Selbst wenn wir das Caching außer Acht lassen und den Index (ohne Tabelle) im ersten Modell mit der Tabelle im zweiten Modell vergleichen, vermute ich, dass der Index größer als die Tabelle sein wird, einfach weil er die size physisch aufzeichnet und hat unbenutzte "Löcher", die für B-Trees typisch sind (obwohl das gleiche für die Tabelle gilt, wenn sie geclustert ).

Und schließlich hat das zweite Modell keinen Overhead für die Indexwartung, der die Leistung von INSERT/UPDATE/DELETE beeinträchtigen könnte.

Abgesehen davon können Sie SUM und COUNT in einer separaten Tabelle zwischenspeichern, die nur eine Zeile enthält. Aktualisieren Sie sowohl SUM als auch COUNT über Trigger, wenn eine Zeile in der Haupttabelle eingefügt, aktualisiert oder gelöscht wird. Sie können dann ganz einfach den aktuellen AVG erhalten, indem Sie einfach SUM und COUNT dividieren.

Aber Sie sollten wirklich messen auf repräsentative Datenmengen, um sicher zu sein.

Da Ihre Abfrage keine WHERE-Klausel enthält, werden alle Zeilen gescannt. Indizes sind nur nützlich, um eine relativ kleine Teilmenge von Tabellenzeilen zu erhalten (und manchmal für Nur-Index-Scans ). Als grobe Faustregel gilt:Wenn mehr als 10 % der Zeilen in der Tabelle benötigt werden, helfen Indizes nicht weiter und das DBMS entscheidet sich oft für einen vollständigen Tabellenscan, selbst wenn Indizes verfügbar sind.