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

Comprendere la struttura dei record MyISAM

Le informazioni che hai nella domanda relativa a MyISAM sono giuste. Tuttavia, vorrei rispondere alle tue due ulteriori domande:

ULTIMA DOMANDA

Secondo il Libro

Capitolo 10:"Motori di archiviazione" Pagina 196 Il paragrafo 7 dice

In base a quel paragrafo, il vecchio record viene sovrascritto con dati di collegamento solo se i nuovi dati da inserire non possono rientrare nel blocco precedentemente allocato. Ciò può comportare molte righe gonfie.

DOMANDA AGGIUNTIVA

Dalla mia risposta precedente, ci sarebbero molti blocchi che hanno

  • blocco di spazio
  • la lunghezza del record
  • il numero di byte non utilizzati nel blocco
  • Flag indicatori di valore NULL
  • probabilmente un puntatore alla continuazione del record se il record non rientrava nello spazio precedentemente creato e doveva essere suddiviso

Tali collegamenti di record inizieranno nella parte anteriore di ogni riga in cui vengono inseriti dati di grandi dimensioni. Questo può gonfiare una tabella MyISAM .MYD archiviare molto rapidamente.

SUGGERIMENTI

Il formato di riga predefinito di un MyISAM è Dinamico. Quando una tabella è dinamica e presenta molti INSERT, UPDATE e DELETE, tale tabella dovrebbe essere ottimizzata con

OPTIMIZE TABLE mytable;

C'è un'alternativa:cambia il formato della riga della tabella su Fisso. In questo modo, tutte le righe hanno le stesse dimensioni. Ecco come rendi il formato riga fisso:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Anche con un formato riga fisso, è necessario impiegare del tempo per individuare un record disponibile, ma il tempo sarebbe O(1) tempo di ricerca (in parole povere, ci vorrebbe la stessa quantità di tempo per individuare un record disponibile, non importa quante righe la tabella ha o quante righe eliminate ci sono). Puoi ignorare questo passaggio abilitando inserimento_concorrente come segue:

Aggiungilo a mio.cnf

[mysqld]
concurrent_insert = 2

Non è richiesto il riavvio di MySQL. Corri

mysql> SET GLOBAL concurrent_insert = 2;

Ciò farebbe sì che tutti gli INSERT vadano sul retro del tavolo senza cercare spazio libero.

Vantaggio delle tabelle a righe fisse

  • INSERT, UPDATE ed DELETE sarebbero un po' più veloci
  • SELECT sono il 20-25% più veloci

Ecco alcuni dei miei post su SELECT che è più veloce per la correzione dei formati di riga

Svantaggio delle tabelle a righe fisse

Nella maggior parte dei casi, quando esegui ALTER TABLE mytable ROW_FORMAT=Fixed; , la tabella può crescere dell'80-100%. Il .MYI anche il file (pagine di indice per la tabella MyISAM) aumenterebbe alla stessa velocità.

EPILOGO

Se vuoi velocità per i tavoli MyISAM e puoi vivere con tavoli più grandi, sarebbero necessari i miei suggerimenti alternativi. Se vuoi risparmiare spazio per ogni tabella MyISAM, lascia il formato della riga così com'è (Dynamic). Dovrai comprimere la tabella con OPTIMIZE TABLE mytable; più frequente con le tabelle dinamiche.