J'ai une suite à ma question précédente concernant la vitesse d'importation avec Inno-Tables (surprise!).
Scénario
J'essaie d'importer un gros vidage de base de données * sur ma machine de développement locale dans un délai raisonnable. Nous avons beaucoup de KEY
s attachés aux tables qui se sont avérés être un goulot d'étranglement mais qui sont toujours importants pour notre système live.
Mon approche après avoir posé la question ci-dessus était de supprimer les KEY ...
instructions de vidage, d'importer et de rajouter des clés.
Cependant, je me retrouve souvent à modifier un vidage en cours pour l'importer localement et je suis tombé sur ces drôles de "commentaires" (The disable/enable keys
-lines)
--
-- Dumping data for table `monster`
--
LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT … INSERT … INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;
Mais en fait, ces "commentaires" sont des déclarations MySql conditionnelles
C'était une nouvelle pour moi, mais ok, étant donné le formulaire de sortie, mysql --version
tout me va bien:
mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3
Ce que je suppose
La table est verrouillée (très bien, c'est juste moi sur le dev mashine). Ensuite, les clés telles que définies dans le schéma de table sont désactivées, les données sont importées, les clés sont activées.
Ainsi, pendant la phase d'insertion de données, il ne devrait pas y avoir de perte de temps sur les clés, mais plutôt examiné après l'insertion de toutes les données.
Je penserais que c'est le même comportement que si je supprimais toutes les KEY 'foo' (foo)'
lignes du vidage, importais le vidage et exécutais un script avec ADD KEY 'foo' ...
ensuite.
Ce que j'observe
Il est beaucoup plus rapide de supprimer manuellement les clés, d'importer et de rajouter des clés, puis de s'appuyer sur des DISABLE KEYS
instructions conditionnelles pour créer monmysqldump
Édition manuelle du vidage + importation mysql + ajout de clés = 15 + 8 + 8 ≈ 30min
Importation simple mysql: abandonné, (je suis juste payé pour 8 heures / jour> :))
Je ne peux pas m'empêcher de penser que je manque quelque chose de très fondamental ici (ou la base de données me traîne).
mysqldump --innodb-optimize-keys
depuis Percona percona.com/doc/percona-server/5.5/management/… Long terme: arrêtez d'utiliser mysqldump et utilisez mydumper ou xtrabackup.Réponses:
Vous ne pouvez pas compter sur
DISABLE KEYS;
etENABLE KEYS;
pour InnoDB car il n'est pas implémenté dans le moteur de stockage InnoDB. En cours d'exécutionALTER TABLE ... DISABLE KEYS;
etALTER TABLE ... ENABLE KEYS;
ont été conçus pour MyISAM. Comme il est dit dans la documentation MySQL pourALTER TABLE
:Aucune mention n'est jamais faite d'InnoDB dans le contexte de
ALTER TABLE ... DISABLE/ENABLE KEYS;
Même si vous exécutez
ALTER TABLE ... DISABLE KEYS;
sur une table InnoDB, il génère un avertissement:C'est pourquoi il n'y a aucun effet. N'oubliez pas que @jynus a mentionné la même chose dans sa réponse au point 7 .
Gardez également à l'esprit que MyISAM conserve les données et les index dans deux fichiers distincts (.MYD pour les données, .MYI pour les index), il serait donc trivial de désactiver et d'activer les index. InnoDB conserve les données de CLÉ PRIMAIRE et de ligne dans les mêmes pages InnoDB (via l'index clusterisé). Les index secondaires porteront la CLÉ PRIMAIRE comme pièce jointe à chaque entrée de feuille d'index secondaire . Étant donné que les données et les index sont entrelacés via l'index clusterisé, personne n'a, jusqu'à présent, tenté d'implémenter
DISABLE KEYS
etENABLE KEYS
dans InnoDB.la source