ALTER TABLE ADD COLUMN prend beaucoup de temps

J’essayais juste d’append une colonne appelée “location” à une table (main_table) dans une firebase database. La commande que j’ai exécutée était

ALTER TABLE main_table ADD COLUMN location varchar (256); 

La main_table contient> 2 000 000 de lignes. Il continue de fonctionner pendant plus de 2 heures et n’est toujours pas terminé.

J’ai essayé d’utiliser mytop pour surveiller l’activité de cette firebase database pour m’assurer que la requête n’est pas verrouillée par un autre processus de requête, mais cela ne semble pas être le cas. Est-ce censé prendre autant de temps? En fait, je viens de redémarrer la machine avant d’exécuter cette commande. Maintenant, cette commande est toujours en cours d’exécution. Je ne sais pas quoi faire.

Votre instruction ALTER TABLE implique que mysql devra réécrire chaque ligne de la table, y compris la nouvelle colonne. Comme vous avez plus de 2 millions de lignes, je pense que cela prendra beaucoup de temps, pendant lequel votre serveur sera probablement principalement lié aux IO. En général, il serait plus performant de faire ce qui suit:

 CREATE TABLE main_table_new LIKE main_table; ALTER TABLE main_table_new ADD COLUMN location varchar(256); INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; DROP TABLE main_table_old; 

De cette façon, vous ajoutez la colonne dans la table vide et écrivez essentiellement les données dans cette nouvelle table que vous êtes sûr que personne d’autre ne regardera sans verrouiller autant de ressources.

Je pense que la solution appropriée consiste à utiliser une fonctionnalité comme pt-online-schema-change ou gh-ost .

Nous avons procédé à la migration de plus de 4 milliards de lignes avec cela, même si cela peut prendre jusqu’à 10 jours, avec moins d’une minute d’interruption.

Percona fonctionne de la même manière que ci-dessus

  • Créer une table temporaire
  • Crée des déclencheurs sur la première table (pour les insertions, les mises à jour, les suppressions) afin qu’ils soient répliqués dans la table temporaire
  • En petits lots, migrez les données
  • Une fois terminé, renommez la table en nouvelle table et supprimez l’autre table

Alter table prend beaucoup de temps avec un big data comme dans votre cas, donc évitez de l’utiliser dans de telles situations, et utilisez du code comme celui-ci:

 select main_table.*, cast(null as varchar(256)) as null_location, -- any column you want accepts null cast('' as varchar(256)) as not_null_location, --any column doesn't accept null cast(0 as int) as not_null_int, -- int column doesn't accept null into new_table from main_table; drop table main_table; rename table new_table TO main_table;