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

Le colonne VARCHAR devono essere messe alla fine delle definizioni delle tabelle in MySQL?

Fare questa domanda su "MySQL" non è utile, poiché MySQL relega l'archiviazione ai motori di archiviazione e implementano l'archiviazione in modi molto diversi. Ha senso porre questa domanda per qualsiasi singolo motore di archiviazione.

Nel motore MEMORY non esistono tipi di dati a lunghezza variabile. Un VARCHAR viene trasformato silenziosamente in un CHAR. Nel contesto della tua domanda:non importa dove in una definizione di tabella metti il ​​tuo VARCHAR.

Nel motore MyISAM, se una tabella non ha dati di lunghezza variabile (VARCHAR, VARBINARY o qualsiasi tipo TEXT o BLOB) è della variante FIXED di MyISAM, ovvero i record hanno una lunghezza di byte fissa. Ciò può avere implicazioni sulle prestazioni, soprattutto se i dati vengono eliminati e inseriti ripetutamente (ad es. la tabella non viene solo aggiunta). Non appena un tipo di dati a lunghezza variabile fa parte di una definizione di tabella, diventa la variante DYNAMIC di MyISAM e MyISAM modifica internamente qualsiasi tipo CHAR tranne il più breve in VARCHAR. Ancora una volta, la posizione e persino la definizione di CHAR/VARCHAR non contano.

Nel motore InnoDB, i dati vengono archiviati in pagine di dimensioni 16 KB. Una pagina ha un piè di pagina con un checksum e un'intestazione di pagina, con tra le altre cose una directory di pagina. La directory della pagina contiene per ogni riga l'offset di quella riga rispetto all'inizio della pagina. Una pagina contiene anche spazio libero e tutti gli I/O vengono eseguiti nelle pagine.

Quindi InnoDB può, fintanto che c'è spazio libero in una pagina, aumentare VARCHAR sul posto e spostare le righe all'interno di una pagina, senza incorrere in ulteriori I/O. Inoltre, poiché tutte le righe vengono indirizzate come (numero di pagina, voce di directory di pagina), lo spostamento di una riga all'interno di una pagina è localizzato nella pagina e non è visibile dall'esterno.

Significa anche che anche per InnoDB l'ordine delle colonne all'interno di una riga non ha alcuna importanza.

Questi sono i tre motori di archiviazione più comunemente utilizzati con MySQL e l'ordine delle colonne non ha importanza per nessuno di questi tre. È possibile che esistano altri motori di archiviazione più esotici per i quali questo non è vero.