Mysql
 sql >> Base de données >  >> RDS >> Mysql

ALTER TABLE dans MySQL :ami ou ennemi ?

L'instruction ALTER TABLE est l'une des instructions les plus fréquemment utilisées dans le monde MySQL - l'instruction vous permet d'ajouter, de supprimer ou de modifier des colonnes dans une table. Dans cet article de blog, nous essaierons d'approfondir ce que c'est, ce qu'il fait et quand doit-il être utilisé.

Qu'est-ce qu'ALTER TABLE et que fait-il ?

Comme déjà mentionné ci-dessus, l'instruction ALTER TABLE permet aux DBA et aux développeurs d'ajouter, de supprimer ou de modifier des colonnes dans une table. En termes simples, ALTER TABLE modifie la structure d'une table - il vous permet d'ajouter, de supprimer des colonnes, d'ajouter ou de supprimer des index, de renommer des colonnes ou de modifier leur type.

Quand et comment utiliser ALTER TABLE ?

Pour utiliser ALTER TABLE, vous avez généralement besoin des privilèges ALTER, CREATE et INSERT. Pour renommer une table, les privilèges requis sont ALTER et DROP pour l'ancienne table, puis les privilèges CREATE, ALTER et INSERT pour la nouvelle table à créer. Pour attribuer les privilèges requis à un certain utilisateur, vous pouvez utiliser la requête suivante :

GRANT ALTER, CREATE, INSERT ON database.* TO 'demo_user';

Remplacez database par le nom de votre base de données, le joker par le nom de la table si vous souhaitez que les privilèges ne s'appliquent qu'à certaines tables (le joker rend le privilège applicable à toutes les tables) et demo_user par le nom de votre utilisateur. Si vous souhaitez que les privilèges soient utilisés sur toutes les bases de données et toutes les tables qu'elles contiennent, remplacez simplement la base de données par un caractère générique :

GRANT ALTER, CREATE, INSERT ON *.* TO 'demo_user';

Afin d'utiliser réellement l'instruction ALTER TABLE, exécutez une requête qui modifie la structure d'une table - ALTER TABLE est utilisé pour ajouter, supprimer ou modifier des colonnes dans une table :la requête peut également être utilisé pour ajouter des index aux colonnes. Voici quelques exemples de base des requêtes les plus fréquemment utilisées :

ALTER TABLE demo_table ADD column_name VARCHAR(255) NOT NULL DEFAULT ‘’; T

sa requête ajouterait une colonne nom_colonne à une table demo_table. Ajoutez FIRST à la fin de la requête pour faire de la colonne la première colonne du tableau.

ALTER TABLE demo_table ADD column_2 VARCHAR(255) NOT NULL DEFAULT ‘’ AFTER column_1; T

sa requête ajouterait une colonne column_2 après la colonne column_1 sur une table demo_table.

ALTER TABLE demo_table ADD COLUMN column_2 INT GENERATED ALWAYS AS (column_1 + 1) STORED; 

Cette requête ajouterait une colonne générée à la table.

ALTER TABLE demo_table DROP COLUMN demo_column; 

Cette requête supprimerait la colonne demo_column sur une table demo_table.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

Cette requête ajouterait un index nommé demo_index (les noms peuvent être choisis) sur une colonne appelée demo_column dans une table appelée demo_table.

ALTER TABLE demo_table ADD INDEX (demo_column), ADD UNIQUE (demo_unique); 

Cette requête ajouterait un index sur une colonne demo_column et un index unique sur la colonne demo_unique.

ALTER TABLE demo_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4; 

Cette requête modifierait le jeu de caractères par défaut d'une colonne spécifique.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

Cette requête modifierait le jeu de caractères par défaut de la table et de toutes les colonnes de caractères (CHAR, VARCHAR et TEXT).

ALTER TABLE demo_table PARTITION BY HASH(demo_column) PARTITIONS 8; 

Cette requête partitionnerait la colonne demo_column en 8 partitions par hachage.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

Cette requête convertirait la table demo_table en stockage sur disque.

Si vous ajoutez des index, gardez à l'esprit que vous pouvez ajouter différents types d'index (par exemple, un index BTREE ou un index FULLTEXT), vous pouvez également ajouter un index qui ne couvre qu'une certaine quantité de caractères dans une colonne avec une requête comme celle-ci :

ALTER TABLE demo_table ADD INDEX demo_index(column_name(10));

La requête ci-dessus ajouterait un index appelé demo_index sur les 10 premiers caractères de la colonne appelée column_name dans une table appelée demo_table.

Les index dans MySQL sont une bête complexe et ils méritent vraiment un sujet à part, nous n'entrerons donc pas dans les détails ici, mais si vous voulez en savoir plus, notre article précédent sur les index MySQL devrait vous en fournir quelques-uns. plus d'informations.

Comment fonctionne ALTER TABLE ?

ALTER TABLE dans MySQL a ses propres subtilités. À partir de la version la plus récente de MySQL, c'est-à-dire MySQL 8.0. Il existe 3 algorithmes pour lesquels affecte la façon dont ALTER TABLE fonctionne pour de telles modifications. Ce sont :

  • COPIER

    • Les opérations sont effectuées sur une copie de la table d'origine et les données de la table sont copiées de la table d'origine vers la nouvelle table ligne par ligne. Dans la plupart des cas, cet algorithme peut être très coûteux en termes d'utilisation des ressources, en particulier pour les grandes et grandes tables. Lorsque cet algorithme est choisi ou sélectionné, tous les DML simultanés ne sont pas autorisés. Par conséquent, toutes les requêtes ultérieures faisant référence à la table affectée devront attendre ou être mises en file d'attente dans la liste des processus. Il y a de fortes chances que votre base de données soit bloquée si les connexions sont au maximum.

  • EN PLACE

    • Les opérations évitent de copier les données de la table mais peuvent reconstruire la table sur place. Un verrou de métadonnées exclusif sur la table peut être pris brièvement pendant les phases de préparation et d'exécution de l'opération. Généralement, le DML simultané est pris en charge.

  • INSTANTANÉ

    • Les opérations ne modifient que les métadonnées dans le dictionnaire de données. Aucun verrou de métadonnées exclusif n'est posé sur la table pendant la préparation et l'exécution, et les données de la table ne sont pas affectées, ce qui rend les opérations instantanées. Le DML simultané est autorisé. (Introduit dans MySQL 8.0.12)

Le processus ALTER TABLE de MySQL n'est peut-être pas un problème avec des tables plus petites, mais si votre ensemble de données est plus volumineux, vous pouvez rencontrer des problèmes - de nombreuses personnes ont rencontré des requêtes ALTER TABLE qui ont pris des heures, des jours ou même des semaines compléter. Dans la plupart des cas, cela se produit à cause du processus de modification de table de MySQL décrit ci-dessus. Cependant, il existe un moyen de réduire au moins légèrement le temps nécessaire à l'exécution de la requête :

  1. Créez une nouvelle table comme votre table source avec la structure souhaitée en exécutant
    CREATE TABLE demo_table_new LIKE demo_table;
    puis ajuster sa structure. Dans ce cas, demo_table est la table source et demo_table_new est la nouvelle table.
  2. Insérez des données dans le nouveau tableau.
  3. Renommez l'ancienne table en demo_table_old (ajustez le nom en fonction de vos besoins).
  4. Renommer la nouvelle table avec l'ancien nom de l'ancienne table.
  5. Enfin, copiez les lignes de l'ancienne table vers la nouvelle et, si nécessaire, créez des index.

Bien que les étapes ci-dessus fonctionnent bien. Pourtant, dans des scénarios de cas réels, les DBA ou les développeurs prennent le parti d'utiliser le changement de schéma pt-online-schema de Percona ou d'utiliser le gh-ost de Github. Vous pouvez jeter un œil à notre article précédent Principaux outils Open Source pour les migrations MySQL et MariaDB qui donne un aperçu de ces outils de changement de schéma.

Quoi qu'il en soit, ce que nous avons décrit ci-dessus est souvent connu sous le nom d'approche "cliché instantané" :en substance, vous créez une nouvelle table avec la structure souhaitée, puis effectuez un renommage et une suppression pour échanger les deux tables . Il existe également un autre moyen :vous pouvez également échanger des serveurs et exécuter ALTER TABLE sur des serveurs qui ne sont pas en production. Pour MyISAM, vous pouvez DÉSACTIVER LES CLÉS, charger des données, puis ACTIVER LES CLÉS.

ALTER TABLE Gotchas

Si vous utilisez l'instruction ALTER TABLE pour créer des index (vous pouvez également utiliser l'instruction CREATE INDEX), il est conseillé de créer des index après avoir inséré les données car c'est un moyen assez connu d'accélérer traitement non seulement dans MySQL, mais également dans d'autres systèmes de gestion de bases de données, tels qu'Oracle. En général cependant, gardez à l'esprit que la plupart des opérations ALTER TABLE devraient causer des problèmes (interruption de service) à MySQL.

Il existe également un autre moyen d'accélérer l'ensemble du processus, bien qu'il soit un peu plus avancé :si vous pouvez convaincre MySQL de ne modifier que le fichier .frm de la table (les fichiers .frm décrivent la définition de la table) et laissez la table tranquille, le processus sera plus rapide :

  1. Créer un tableau vide avec la même mise en page que l'ancien tableau sans le modifier.
  2. Fermez toutes les tables en cours d'utilisation et empêchez l'ouverture de toutes les nouvelles tables en exécutant  
    FLUSH TABLES WITH READ LOCK.
  3. Échangez les fichiers .frm.
  4. Libérez le verrou de lecture en exécutant UNLOCK TABLES.

Gardez également à l'esprit que si vous souhaitez modifier une colonne et que la syntaxe semble correcte mais que vous obtenez toujours une erreur, il est peut-être temps de rechercher une syntaxe différente. Par exemple :

ALTER TABLE demo_table ADD long VARCHAR(255); 

Une requête comme celle-ci générerait une erreur car long est un mot réservé. Afin d'éviter une telle erreur, échappez le mot avec des backticks :

ALTER TABLE demo_table ADD `long` VARCHAR(255);

Il convient également de noter que les noms de colonne ne peuvent être échappés qu'à l'aide de backticks et non avec des guillemets simples ou des guillemets doubles. Par exemple, une requête comme celle-ci générerait également une erreur :

ALTER TABLE demo_table CHANGE COLUMN ‘demo_column’ ‘demo_column_2’ VARCHAR(255);

Résumé

MySQL utilise l'instruction ALTER TABLE pour ajouter, supprimer ou modifier des colonnes dans une table. Pour que l'instruction soit exécutée avec succès, vous devez disposer des privilèges ALTER, CREATE et INSERT pour la table. L'instruction a également quelques subtilités qui lui sont propres :ses performances peuvent souffrir lors de l'exécution sur de très grandes tables en raison de la façon dont elle fonctionne, mais tant que vous savez comment l'instruction fonctionne et ce qu'elle fait, tout devrait bien se passer.