Der folgende Auszug stammt aus dem Buch " High Performance MySQL, Second Edition ".
Dies ist ein ausgezeichnetes Buch und ich würde es jedem empfehlen.
Die kurze Antwort lautet:
Mit Ihrer Tischgröße und Ihren Tischbedingungen, egal für welche Methode Sie sich entscheiden, ich denke, Sie werden möglicherweise lange warten müssen.
Tabellenkonvertierungen
Es gibt verschiedene Möglichkeiten, eine Tabelle von einer Speicher-Engine in eine andere zu konvertieren, die jeweils Vor- und Nachteile haben.
ALTER TABLE
mysql> ALTER TABLE mytable ENGINE = Falcon;
Diese Syntax funktioniert für alle Speicher-Engines, aber es gibt einen Haken: Es kann viel Zeit in Anspruch nehmen. MySQL führt eine zeilenweise Kopie Ihrer alten Tabelle in eine neue Tabelle durch. Während dieser Zeit wird wahrscheinlich die gesamte Festplatten-E / A-Kapazität des Servers verwendet, und die ursprüngliche Tabelle wird während der Konvertierung schreibgeschützt.
Dump und Import
Um mehr Kontrolle über den Konvertierungsprozess zu erhalten, können Sie die Tabelle zunächst mit dem Dienstprogramm mysqldump in eine Textdatei sichern. Sobald Sie die Tabelle gesichert haben, können Sie die Speicherauszugsdatei einfach bearbeiten, um die darin enthaltene Anweisung CREATE TABLE anzupassen. Stellen Sie sicher, dass Sie sowohl den Tabellennamen als auch den Typ ändern, da Sie nicht zwei Tabellen mit demselben Namen in derselben Datenbank haben können, auch wenn sie unterschiedlichen Typs sind. Mysqldump schreibt standardmäßig einen Befehl DROP TABLE vor CREATE TABLE Sie könnten also Ihre Daten verlieren, wenn Sie nicht vorsichtig sind!
ERSTELLEN und AUSWÄHLEN
Die dritte Umwandlungstechnik ist ein Kompromiss zwischen der Geschwindigkeit des ersten Mechanismus und der Sicherheit des zweiten. Erstellen Sie die neue Tabelle und füllen Sie sie wie folgt mit der INSERT ... SELECT-Syntax von MySQL, anstatt die gesamte Tabelle zu sichern oder alles auf einmal zu konvertieren:
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
Das funktioniert gut, wenn Sie nicht viele Daten haben, aber wenn Sie dies tun, ist es oft effizienter, die Tabelle inkrementell zu füllen und die Transaktion zwischen jedem Block festzuschreiben, damit die Rückgängig-Protokolle nicht riesig werden. Angenommen, id ist der Primärschlüssel, führen Sie diese Abfrage wiederholt aus (wobei Sie jedes Mal größere Werte von x und y verwenden), bis Sie alle Daten in die neue Tabelle kopiert haben:
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;
Danach bleiben Ihnen die ursprüngliche Tabelle, die Sie löschen können, wenn Sie damit fertig sind, und die neue Tabelle, die jetzt vollständig gefüllt ist. Achten Sie darauf, die Originaltabelle bei Bedarf zu sperren, um eine inkonsistente Kopie der Daten zu vermeiden!