web-dev-qa-db-fra.com

Optimiser mySql pour une colonne d'ajout de table de modification plus rapide

J'ai une table qui a 170 002 225 lignes avec environ 35 colonnes et deux index. Je veux ajouter une colonne. La commande alter table a pris environ 10 heures. Ni le processeur ne semblait occupé pendant cette période, ni les attentes excessives IO attend. Il s'agit d'une boîte haute performance à 4 voies avec des tonnes de mémoire.

Est-ce le mieux que je puisse faire? Y a-t-il quelque chose que je peux regarder pour optimiser la colonne d'ajout dans le réglage de la base de données?

50
Andrew

J'ai fait face à une situation très similaire dans le passé et j'améliore ainsi les performances de l'opération:

  1. Créez une nouvelle table (en utilisant la structure de la table actuelle) avec la ou les nouvelles colonnes incluses.
  2. exécuter une INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  3. renommer la table actuelle
  4. renommer la nouvelle table en utilisant le nom de la table actuelle.
38
RRUZ

ALTER TABLE dans MySQL va réellement créer une nouvelle table avec un nouveau schéma, puis re -INSERT toutes les données et supprimer l'ancienne table. Vous pouvez gagner du temps en créant la nouvelle table, en chargeant les données, puis en renommant la table.

Extrait du "livre MySQL haute performance" (les gars de Percona):

L'astuce habituelle pour charger efficacement la table MyISAM consiste à désactiver les clés, à charger les données et à renalbe les clés:

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;
6
FoneyOp

Eh bien, je recommanderais d'utiliser les dernières versions de Percona MySQL plus car il y a la note suivante dans le manuel MySQL

Dans d'autres cas, MySQL crée une table temporaire, même si les données n'ont pas strictement besoin d'être copiées. Pour les tables MyISAM, vous pouvez accélérer l'opération de recréation d'index (qui est la partie la plus lente du processus de modification) en définissant la variable système myisam_sort_buffer_size sur une valeur élevée.

Tu peux faire ALTER TABLE DISABLE KEYS d'abord, puis ajoutez une colonne puis ALTER TABLE ENABLE KEYS. Je ne vois rien qui puisse être fait ici.

BTW, tu ne peux pas aller MongoDB? Il ne reconstruit rien lorsque vous ajoutez une colonne.

3

Peut-être pouvez-vous supprimer l'index avant de modifier la table, car ce qui prend le plus de temps à construire est l'index?

3
Gigamegs