43 votes

Comment désactiver l'index dans innodb

J'essaie d'accélérer l'insertion en vrac dans une table InnoDB en désactivant temporairement ses index :

ALTER TABLE mytable DISABLE KEYS;

Mais il donne un avertissement :

+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

Comment pouvons-nous désactiver les index ?

Quelles sont les alternatives pour éviter d'utiliser l'index lors de la réalisation d'inserts en vrac ?

Comment pouvons-nous accélérer le processus ?

39voto

lurkerbelow Points 661

Avez-vous essayé ce qui suit ?

    SET autocommit=0; 
    SET unique_checks=0; 
    SET foreign_key_checks=0;

Extrait des références MySQL https://dev.mysql.com/doc/refman/8.0/fr/optimizing-innodb-bulk-data-loading.html

Voir la section « Conseils de chargement de données en vrac »

21voto

KciNicK Points 141

Un peu tard mais... peu importe... oubliez toutes les réponses ici, ne désactivez pas les index, il n'y a aucun moyen, il suffit de les laisser tomber ALTER tablename DROP INDEX whatever, insert vrac les données, puis ALTER tablename tablename AJOUTER INDEX whatever whatever) ; le temps de recréation des index est de 1% de l'insert vrac avec des index dessus, comme 400000 lignes a pris 10 minutes avec des index et comme 2 secondes sans eux..., bravo...

9voto

staabm Points 395

pour réduire les coûts de recalcul des index, vous devez insérer les données soit à l'aide de DATA INFILE, soit à l'aide de Mysql Multi Row Inserts, comme

INSÉRER DANS tbl_name (a,b,c) LES VALEURS(1,2,3),(4,5,6),(7,8,9) ;

-> donc insérer plusieurs lignes avec une seule instruction.

Le nombre de lignes que l'on peut insérer avec une seule instruction dépend du paramètre mysql max_allowed_packet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X