Comment faire pour désactiver l'index en innodb
Je suis en train d'accélérer l'instruction bulk insert dans une table InnoDB par la désactivation temporaire de ses index:
ALTER TABLE mytable DISABLE KEYS;
Mais il donne une avertissement:
+-------+------+-------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------+
| Note | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
Comment peut-on désactiver l'index?
Quelles sont les alternatives pour éviter d'utiliser l'index pour faire des insertions?
Comment pouvons-nous accélérer le processus?
- Quelle quantité de données que vous avez (en termes de lignes et de gigaoctets)? Et comment voulez-vous charger?
- environ 5 millions de lignes et d'environ 1,2 GO. Merci.
- Connexes: stackoverflow.com/q/654594/632951
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé le suivant?
À partir de la base de Références 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"
show keys in my_table
pour voir si les indices sont activés ou désactivés.Il y a une très bonne raison pourquoi vous ne pouvez pas exécuter
DISABLE KEYS
sur une table InnoDB; InnoDB n'est pas conçu pour l'utiliser, et MyISAM est.En fait, voici ce qui se passe quand vous rechargez un mysqldump:
Vous verrez un
CREATE TABLE
pour un MyISAM tableau suivant par un verrou en écriture.Avant que toutes les insertions sont exécutés, un appel à
ALTER TABLE ... DISABLE KEYS
est fait.Ce que ce n'est éteindre le second index dans la table MyISAM.
Puis, insertions sont faites. Tout cela est fait, la CLÉ PRIMAIRE et de tous UNIQUE de CLÉS dans la table MyISAM sont désactivés. Avant la
UNLOCK TABLEs
, un appelALTER TABLE ... ENABLE KEYS
est fait dans le but de reconstruire tous les index de façon linéaire.À mon humble avis, cette opération n'a pas été codé dans le Moteur de Stockage InnoDB parce que de toutes les clés dans un index non unique venu avec la clé primaire de l'entrée de gen_clust_index (aka Index Cluster). Ce serait une opération très coûteuse car la création d'un index non unique nécessiterait O(n log n) temps de fonctionnement pour récupérer chaque clé unique pour l'attacher à un non-clé unique.
À la lumière de cela, l'affichage d'un avertissement au sujet d'essayer de
DISABLE KEYS/ENABLE KEYS
sur une table InnoDB est beaucoup plus facile que le codage des exceptions à la commande mysqldump pour toutes les affaires impliquant des moteurs de stockage MyISAM.innodb
tables avec beaucoup d'index (des centaines de giga-octets / 10+ différents indices). Il y a une énorme réduction du temps de création, quand jeINSERT
dans des tableaux sans index. De toute évidence, "énorme" dépend fortement de la taille définitive de votre table, le nombre et le type d'index, les types d'éléments de données, etc. J'ai l'habitude de créer la table avec rien, mais la clé primaire (pas nécessaire si vous êtes juste de chargement de données qui a déjà un id de clé primaire), puis créer les index à la fin. Vous pouvez ne pas remarquer une différence à 5MM de lignes et de 1,5 GO, mais comme vos tables grandissent, vous.à réduire les coûts pour le re-calcul de l'index, vous devez insérer les données à l'aide de DATA INFILE ou de l'utilisation de Mysql Multi Insertions de lignes, comme
-> si l'insertion de plusieurs lignes avec une seule instruction.
Combien de lignes on peut insérer avec un énoncé dépend de la max_allowed_packet mysql réglage.
INSERT
s à plusieurs lignes avec 1 déclaration réduit le temps de téléchargement de 10 minutes à 10 secondes.Un peu en retard mais... quoi que... oublier ici toutes les réponses, ne pas désactiver l'index, il n'y a aucun moyen, il suffit de déposer leur ALTER TABLE nom_table DROP INDEX
whatever
, bulk insert les données, puis de l'instruction ALTER TABLE nom_table ADD INDEXwhatever
(whatever
); la quantité de temps de recréer l'index est 1% de la masse de l'insérer avec l'index sur elle, comme 400000 rangs, a pris 10 minutes, avec des index et comme les 2 secondes sans eux..., acclamations...