Optimiser un ALTER

mai 30, 2012

Lors d’une discussion à la cafèt, la question suivante fut posée : « Faire un ALTER TABLE avec plusieurs instructions est il plus rapide qu’un ALTER TABLE par instruction » ?

Les 2 protagonistes n’étant pas d’accord entre eux, c’est tout naturellement que je fus invité à donner mon avis.

La réponse me semble assez intuitive, mais comme des chiffres valent mieux qu’un longs discours…

 

 

Le contexte :

  • MySQL Community Server 5.5.22
  • Une table InnoDB de 8 539 238 enregistrements
  • 17 colonnes avec INT, CHAR, VARCHAR, TEXT, DATETIME, …

 

 

Ajout de 3 index (en une seule commande)

 

 

Ce qui fait un total de 146.43 sec

 

 

Suppression de index (en une seule commande)

 

 

Au passage on peut remarquer que depuis MySQL 5.5, supprimer des index secondaires (non clé primaire) ne coûte rien.

 

 

 

Ajout de 3 index (en 3 commandes)

 

 

 

 

Ce qui fait un total de 151.16 sec (4 % plus lent)

 

Bien entendu, plus le volume de donnée à déplacer est important, plus l’écart entre les 2 façons de faire risque d’être important.

 

Suppression de index (en 3 commandes)

 

 

 

 

Total: 1.77 sec

 

CQFD

 

 

Divers

 

 

 

 

2 Responses to “Optimiser un ALTER”

  1. La différence est nette rien qu’en se contentant d’ajouter des indexes. Si je ne m’abuse, elle aurait probablement encore été plus flagrante en ajoutant des colonnes.

  2. Bonjour,
    oui tout à fait !

    ALTER TABLE sbtest ADD COLUMN d char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  »;
    Query OK, 10000000 rows affected (1 min 50.76 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    ALTER TABLE sbtest ADD COLUMN e char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  »;
    Query OK, 10000000 rows affected (2 min 18.31 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    ALTER TABLE sbtest ADD COLUMN f char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  »;
    Query OK, 10000000 rows affected (2 min 48.80 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    ALTER TABLE sbtest DROP COLUMN d; ALTER TABLE sbtest DROP COLUMN e; ALTER TABLE sbtest DROP COLUMN f;
    Query OK, 10000000 rows affected (2 min 23.38 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    Query OK, 10000000 rows affected (1 min 59.28 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    Query OK, 10000000 rows affected (1 min 31.99 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0
    ***************************************************************
    ALTER TABLE sbtest ADD COLUMN d char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  », ADD COLUMN e char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  », ADD COLUMN f char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT  »;
    Query OK, 10000000 rows affected (2 min 40.77 sec)

    ALTER TABLE sbtest DROP COLUMN d, DROP COLUMN e, DROP COLUMN f;
    Query OK, 10000000 rows affected (1 min 36.89 sec)
    Records: 10000000 Duplicates: 0 Warnings: 0

    Il n’y a pas photo 🙂

    ++