Conversion d'une grande table de MyISAM à Innodb


9

J'ai une table avec environ 300 millions de lignes au format MyISAM que je souhaite convertir en Innodb

Mon objectif initial était de réduire l'utilisation en modifiant le schéma de la table pour avoir des index plus simples. J'ai vidé toute la table, je l'ai laissée tomber, je l'ai recréée avec moins d'index et je suis maintenant en train de réimporter. Cependant, j'ai oublié de préciser que ce devrait être innodb au lieu de myisam.

Puis-je simplement faire le ALTER TABLE standard ... MOTEUR = INNODB? Y a-t-il quelque chose de spécial dont je devrais être conscient avec une table aussi énorme?

L'opération d'importation de données prend environ 12 heures - je répugne à recommencer. C'est pourquoi je veux simplement le convertir.


Avec 300 millions de lignes, MyISAM est probablement un ajustement plus rapide et meilleur pour une table de cette taille!
Mark Henderson

Réponses:


14

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!


2

L'instruction ALTER TABLE fait essentiellement la même chose: le serveur crée une table temporaire où il copie toutes les lignes, puis effectue un RENAME. Les formats sur disque sont extrêmement différents entre InnoDB et MyISAM, donc je ne m'attends pas à ce que vous trouviez un raccourci vers cela.

Autre remarque (que vous connaissez peut-être, mais qui aiderait les autres à lire ceci): le format sur disque pour InnoDB dépend fortement de la clé primaire, car il regroupe les enregistrements en fonction de celle-ci. Donc, lorsque vous travaillez avec de grandes tables InnoDB, réfléchissez-y à deux fois avant de choisir la clé primaire, car la changer reconstruit la table entière, tout comme le problème actuel.

Quoi qu'il en soit, je recommande de faire d'abord quelques tests sur une table de taille moyenne et de les chronométrer.


2
Toute opération de modification de table dans MySQL (et qui inclut l'ajout d'index) reconstruit la table.
David Pashley
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.