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!