L'extrait suivant est sorti du livre " High Performance MySQL, Second Edition ".
C'est un excellent livre et je le recommande à tout le monde.
La réponse courte est:
Avec la taille et les conditions de votre table, quelle que soit la méthode que vous choisissez, je pense que vous risquez de devoir attendre longtemps.
Conversions de table
Il existe plusieurs façons de convertir une table d'un moteur de stockage à un autre, chacune avec ses avantages et ses inconvénients.
MODIFIER TABLE
mysql> ALTER TABLE mytable ENGINE = Falcon;
Cette syntaxe fonctionne pour tous les moteurs de stockage, mais il y a un hic: cela peut prendre beaucoup de temps. MySQL effectuera une copie ligne par ligne de votre ancienne table dans une nouvelle table. Pendant ce temps, vous utiliserez probablement toute la capacité d'E / S disque du serveur et la table d'origine sera verrouillée en lecture pendant l'exécution de la conversion.
Dump et importation
Pour mieux contrôler le processus de conversion, vous pouvez d'abord choisir de vider la table dans un fichier texte à l'aide de l'utilitaire mysqldump. Une fois que vous avez vidé la table, vous pouvez simplement modifier le fichier de vidage pour ajuster l'instruction CREATE TABLE qu'il contient. Assurez-vous de changer le nom de la table ainsi que son type, car vous ne pouvez pas avoir deux tables avec le même nom dans la même base de données même si elles sont de types différents - et mysqldump par défaut écrit une commande DROP TABLE avant la CREATE TABLE , vous risquez donc de perdre vos données si vous ne faites pas attention!
CRÉER et SÉLECTIONNER
La troisième technique de conversion est un compromis entre la vitesse du premier mécanisme et la sécurité du second. Plutôt que de vider la table entière ou de la convertir en une seule fois, créez la nouvelle table et utilisez la syntaxe INSERT ... SELECT de MySQL pour la remplir, comme suit:
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
Cela fonctionne bien si vous n'avez pas beaucoup de données, mais si c'est le cas, il est souvent plus efficace de remplir la table de manière incrémentielle, en validant la transaction entre chaque bloc afin que les journaux d'annulation n'augmentent pas énormément. En supposant que id est la clé primaire, exécutez cette requête à plusieurs reprises (en utilisant à chaque fois des valeurs plus grandes de x et y) jusqu'à ce que vous ayez copié toutes les données dans la nouvelle table:
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;
Après cela, vous vous retrouverez avec la table d'origine, que vous pourrez supprimer lorsque vous en aurez terminé, et la nouvelle table, qui est maintenant entièrement remplie. Veillez à verrouiller la table d'origine si nécessaire pour éviter d'obtenir une copie incohérente des données!