Conversione di un grande tavolo da MyISAM a Innodb


9

Ho una tabella con circa 300 milioni di righe in formato MyISAM che voglio convertire in Innodb

Il mio obiettivo originale era ridurre l'utilizzo modificando lo schema della tabella per avere indici più semplici. Ho scaricato tutto il tavolo, l'ho lasciato cadere, lo ho ricreato con meno indici e ora sto reimportando. Tuttavia, ho dimenticato di specificare che dovrebbe essere innodb invece di myisam.

Posso semplicemente fare lo standard ALTER TABLE ... ENGINE = INNODB? C'è qualcosa di speciale di cui dovrei essere consapevole con un tavolo così enorme?

L'operazione di importazione dei dati sta impiegando circa 12 ore - non sopporto di farlo di nuovo. Quindi perché voglio solo convertirlo.


Con 300 milioni di righe, MyISAM è probabilmente una soluzione più veloce e migliore per una tabella di quelle dimensioni!
Mark Henderson,

Risposte:


14

Il seguente estratto è uscito dal libro " High Performance MySQL, Second Edition ".

Questo è un libro eccellente e lo consiglierei a chiunque.

La risposta breve è:

Con le dimensioni e le condizioni della tabella, indipendentemente dal metodo scelto, penso che potresti essere in attesa di una lunga attesa.


Conversioni da tabella

Esistono diversi modi per convertire una tabella da un motore di archiviazione a un altro, ciascuno con vantaggi e svantaggi.

ALTER TABLE

mysql> ALTER TABLE mytable ENGINE = Falcon;

Questa sintassi funziona per tutti i motori di archiviazione, ma c'è un problema: può richiedere molto tempo. MySQL eseguirà una copia riga per riga della vecchia tabella in una nuova tabella. Durante quel periodo, probabilmente utilizzerai tutta la capacità di I / O del disco del server e la tabella originale verrà bloccata in lettura durante l'esecuzione della conversione.

Dump e importazione

Per ottenere un maggiore controllo sul processo di conversione, è possibile scegliere di eseguire prima il dump della tabella in un file di testo utilizzando l'utilità mysqldump. Dopo aver scaricato la tabella, puoi semplicemente modificare il file di dump per regolare l'istruzione CREATE TABLE che contiene. Assicurati di cambiare il nome della tabella e il suo tipo, perché non puoi avere due tabelle con lo stesso nome nello stesso database anche se sono di tipi diversi — e mysqldump ha come impostazione predefinita la scrittura di un comando DROP TABLE prima di CREATE TABLE , quindi potresti perdere i tuoi dati se non stai attento!

CREA E SELEZIONA

La terza tecnica di conversione è un compromesso tra la velocità del primo meccanismo e la sicurezza del secondo. Invece di scaricare l'intera tabella o convertirla tutta in una volta, crea la nuova tabella e usa la sintassi INSERT ... SELECT di MySQL per popolarla, come segue:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Funziona bene se non hai molti dati, ma se lo fai, è spesso più efficiente popolare la tabella in modo incrementale, impegnando la transazione tra ogni blocco in modo che i registri di annullamento non diventino enormi. Supponendo che id sia la chiave primaria, esegui ripetutamente questa query (usando ogni volta valori maggiori di xey) fino a quando non avrai copiato tutti i dati nella nuova tabella:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Dopo aver fatto ciò, ti verrà lasciato con la tabella originale, che puoi eliminare una volta terminata, e la nuova tabella, che ora è completamente popolata. Fare attenzione a bloccare la tabella originale, se necessario, per evitare di ottenere una copia incoerente dei dati!


2

L'istruzione ALTER TABLE essenzialmente fa la stessa cosa: il server crea una tabella temporanea in cui copia tutte le righe e quindi esegue un RENAME. I formati su disco sono estremamente diversi tra InnoDB e MyISAM, quindi non mi aspetto che tu trovi alcun collegamento a questo.

Un'altra osservazione (di cui potresti essere a conoscenza, ma che aiuterebbe gli altri a leggere questo): il formato su disco per InnoDB dipende fortemente dalla chiave primaria, perché raggruppa i record basati su di essa. Quindi, quando si lavora con grandi tabelle InnoDB, pensaci due volte prima di scegliere la chiave primaria, perché cambiandola si ricostruisce l'intera tabella, proprio come il problema attuale.

Ad ogni modo, raccomando di fare alcuni test prima su un tavolo di dimensioni moderate e poi quelli.


2
Qualsiasi operazione di modifica della tabella in MySQL (e che include l'aggiunta di indici) ricostruisce la tabella.
David Pashley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.