Mysql
 sql >> Database >  >> RDS >> Mysql

Velocità di query in base all'ordine delle colonne

La risposta è sì, è importante e può avere una grande importanza, ma di solito non molto.

Tutto l'I/O viene eseguito a livello di pagina (in genere 2K o 4K a seconda del sistema operativo). I dati delle colonne per le righe vengono archiviati uno accanto all'altro, tranne quando la pagina si riempie, nel qual caso i dati vengono scritti nell'altra pagina (di solito la successiva).

Maggiore è lo spazio dati su disco richiesto per le colonne tra (in base alla definizione della tabella) le colonne selezionate, maggiore è la possibilità che i dati per le colonne selezionate si trovino (a volte) su pagine diverse. Trovarsi su una pagina diversa può comportare un'operazione di I/O aggiuntiva (se non ci sono altre righe selezionate nell'altra pagina). Nel peggiore dei casi, ogni colonna che selezioni potrebbe trovarsi su una pagina diversa.

Ecco un esempio:

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)
);

Confronto:seleziona num1, num2, num3 da bad_layout; seleziona num1, num2, num3 da better_layout;

Poiché per bad_layout ogni colonna num sarà sostanzialmente su una pagina diversa, ogni riga richiederà 3 operazioni di i/O. Al contrario, per better_layout num colonne di solito si trovano sulla stessa pagina.

È probabile che la query bad_layout richieda circa 3 volte più tempo per essere eseguita.

Un buon layout della tabella può fare una grande differenza per le prestazioni delle query. Dovresti cercare di mantenere le colonne che di solito vengono selezionate insieme il più vicino possibile l'una all'altra nel layout della tabella.