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

Abfragegeschwindigkeit basierend auf der Reihenfolge der Spalten

Die Antwort ist ja, es spielt eine Rolle, und es kann sehr wichtig sein, aber normalerweise nicht viel.

Die gesamte E/A erfolgt auf Seitenebene (in der Regel 2 KB oder 4 KB, je nach Betriebssystem). Spaltendaten für Zeilen werden nebeneinander gespeichert, außer wenn die Seite voll wird, in diesem Fall werden die Daten auf die andere (normalerweise die nächste) Seite geschrieben.

Je größer der Speicherplatz auf der Festplatte ist, der für Spalten zwischen (basierend auf der Tabellendefinition) den ausgewählten Spalten erforderlich ist, desto größer ist die Wahrscheinlichkeit, dass sich die Daten für die ausgewählten Spalten (manchmal) auf verschiedenen Seiten befinden. Wenn Sie sich auf einer anderen Seite befinden, kann dies zu einer zusätzlichen E/A-Operation führen (wenn auf der anderen Seite keine anderen Zeilen ausgewählt sind). Im schlimmsten Fall könnte sich jede ausgewählte Spalte auf einer anderen Seite befinden.

Hier ist ein Beispiel:

create table bad_layout (
num1 int,
large1 varchar(4000),
num2 int,
large2 varchar(4000),
num3 int,
large3 varchar(4000)
);

create table better_layout (
num1 int,
num2 int,
num3 int,
large1 varchar(4000),
large2 varchar(4000),
large3 varchar(4000)
);

Vergleich:wähle num1, num2, num3 aus schlechtem_Layout;wähle num1, num2, num3 aus better_layout;

Da sich bei bad_layout jede num-Spalte grundsätzlich auf einer anderen Seite befinden wird, erfordert jede Zeile 3 E/A-Operationen. Umgekehrt befinden sich für better_layout num Spalten normalerweise auf derselben Seite.

Die Ausführung der bad_layout-Abfrage dauert wahrscheinlich etwa dreimal länger.

Ein gutes Tabellenlayout kann die Abfrageleistung erheblich verbessern. Sie sollten versuchen, Spalten, die normalerweise zusammen ausgewählt werden, im Tabellenlayout so nah wie möglich beieinander zu halten.