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 désactiver les index?

Quelles sont les alternatives pour éviter d'utiliser l'index pour faire des insertions?

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

26
demandé sur Pacerier 2012-03-02 02:07:55

4 réponses

avez-vous essayé ce qui suit?

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

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

Voir La Section " En Vrac Chargement Des Données Des Conseils "

27
répondu lurkerbelow 2016-06-17 16:56:22

il y a une très bonne raison pour laquelle vous ne pouvez pas exécuter DISABLE KEYS sur une table InnoDB; InnoDB n'est pas conçu pour l'utiliser, et MyISAM l'est.

En fait, voici ce qui se passe quand vous rechargez un mysqldump:

vous verrez un CREATE TABLE pour une table MyISAM suivie d'une écriture lock.

avant que tous les encarts soient lancés, un appel à ALTER TABLE ... DISABLE KEYS est fait.

ce que cela fait est de désactiver secondaire index dans la table MyISAM.

ensuite, inserts en vrac sont faits. Pendant ce temps, la clé primaire et toutes les clés uniques de la table MyISAM sont désactivées. Avant le UNLOCK TABLEs , un appel ALTER TABLE ... ENABLE KEYS est fait afin de reconstruire tous les index non uniques de façon linéaire.

IMHO cette opération n'a pas été codée dans le moteur de stockage InnoDB parce que toutes les clés d'un index non unique viennent avec l'entrée de la clé primaire de gen_clust_index (alias Clustered Index). Il s'agirait d'une opération très coûteuse puisque la construction d'un index non unique exigerait un temps D'exécution O(N log n) pour récupérer chaque clé unique à attacher à une clé non unique.

à la lumière de cela, l'affichage d'un avertissement sur le fait d'essayer de DISABLE KEYS/ENABLE KEYS sur une table InnoDB est beaucoup plus facile que le codage des exceptions au mysqldump pour tous les cas spéciaux impliquant des moteurs de stockage non-MyISAM.

25
répondu RolandoMySQLDBA 2017-04-13 12:13:48

pour réduire les coûts de recalcul des index, vous devez insérer les données soit en utilisant DATA INFILE ou en utilisant Mysql Inserts à plusieurs lignes, comme

INSERT INTO tbl_name (a,b, c) VALUES(1,2,3),(4,5,6),(7,8,9);

- > insérant ainsi plusieurs lignes avec une déclaration.

le nombre de lignes qu'on peut insérer avec une déclaration dépend du max_allowed_packet mysql paramètre.

8
répondu staabm 2016-07-08 07:43:34

un peu tard mais... quoi... oubliez toutes les réponses ici, ne pas désactiver les index, il n'y a pas moyen , il suffit de les déposer modifier table tablename DROP INDEX whatever , insérer les données en vrac, puis modifier table tablename ajouter INDEX whatever ( whatever ); le temps de recréer les index est de 1% de l'insertion en vrac avec des index, comme 400000 lignes a pris 10 minutes avec des index et comme 2 secondes sans eux..., acclamation...

-1
répondu KciNicK 2018-09-23 23:45:39