Domanda

MySQL specifica il formato di riga di una tabella come fisso o dinamico, a seconda dei tipi di dati della colonna. Se una tabella ha un tipo di dati di colonna a lunghezza variabile, ad esempio TEXT o VARCHAR, il formato della riga è dinamico; in caso contrario, è stato risolto.

La mia domanda è: qual è la differenza tra i due formati di riga? Uno è più efficiente dell'altro?

È stato utile?

Soluzione

La differenza conta davvero solo per MyISAM, altri motori di archiviazione non si preoccupano della differenza. EDIT: molti utenti hanno commentato che a InnoDB interessa: link 1 di steampowered , link 2 di Kaan .

Con MyISAM con righe a larghezza fissa, ci sono alcuni vantaggi:

  1. Nessuna frammentazione di riga: è possibile con righe di larghezza variabile dividere singole righe in più sezioni nel file di dati. Ciò può aumentare la ricerca dei dischi e rallentare le operazioni. È possibile deframmentarlo con OPTIMIZE TABLE, ma questo non è sempre pratico.

  2. Dimensioni del puntatore del file di dati: in MyISAM, esiste un concetto di puntatore del file di dati che viene utilizzato quando deve fare riferimento al file di dati. Ad esempio, questo viene utilizzato negli indici quando si riferiscono a dove è effettivamente presente la riga. Con dimensioni di larghezza fisse, questo puntatore si basa sull'offset di riga nel file (cioè le righe sono 1, 2, 3 indipendentemente dalle loro dimensioni). Con larghezza variabile, il puntatore si basa sull'offset del byte (cioè le righe potrebbero essere 1, 57, 163). Il risultato è che con tabelle di grandi dimensioni, il puntatore deve essere più grande, il che aggiunge potenzialmente molto più sovraccarico alla tabella.

  3. Più facile da risolvere in caso di corruzione. Poiché ogni riga ha le stesse dimensioni, se la tabella MyISAM viene danneggiata, è molto più facile ripararla, quindi perderai solo i dati effettivamente danneggiati. Con la larghezza variabile, in teoria è possibile che i puntatori a larghezza variabile vengano incasinati, il che può comportare la perdita di dati in modo errato.

Ora lo svantaggio principale della larghezza fissa è che spreca più spazio. Ad esempio, è necessario utilizzare i campi CHAR anziché i campi VARCHAR, quindi si finisce con uno spazio aggiuntivo occupato.

Normalmente, non avrai molta scelta nel formato, poiché è dettato in base allo schema. Tuttavia, potrebbe valere la pena se hai solo pochi varchar o un singolo BLOB / testo per cercare di ottimizzare. Ad esempio, considera di cambiare l'unico varchar in un carattere o di dividere il BLOB nella sua tabella.

Puoi leggere ancora di più al riguardo su:

http://dev.mysql.com/doc/ refman / 5.0 / it / static-format.html

http://dev.mysql.com/doc/ refman / 5.0 / it / dinamico format.html

Altri suggerimenti

Una differenza chiave si verifica quando si aggiorna un record. Se il formato della riga è fisso, non vi è alcun cambiamento nella lunghezza del record. Al contrario, se il formato di riga è dinamico e i nuovi dati fanno aumentare la lunghezza del record, viene utilizzato un collegamento per puntare al "overflow" dati (ovvero si chiama puntatore di overflow).

Questo frammenta la tabella e generalmente rallenta le cose. Esiste un comando per la deframmentazione (OPTIMIZE TABLE), che in qualche modo mitiga il problema.

Questa pagina nella documentazione di MySQL sembra contraddire la risposta principale qui, in quanto il formato di riga DYNAMIC significa qualcosa anche per le tabelle InnoDB:

http://dev.mysql.com/doc/innodb /1.1/en/innodb-row-format-dynamic.html

Fisso significa che ogni riga ha esattamente le stesse dimensioni. Ciò significa che se la terza riga in una pagina di dati deve essere caricata, sarà esattamente PageHeader + 2 * RowSize, risparmiando un po 'di tempo di accesso.

Per trovare l'inizio di un record dinamico, è necessario consultare l'elenco degli offset dei record, il che comporta un ulteriore riferimento indiretto.

In breve, sì, c'è un leggero aumento delle prestazioni per le righe dinamiche. No, non è molto grande. Se pensi che sarà un problema, provalo.

Risolto dovrebbe essere più veloce e più sicuro che dinamico, con lo svantaggio di avere una lunghezza fissa. Puoi trovare queste informazioni qui: http: //dev.mysql .com / doc / refman / 5.0 / it / static-format.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top