MySQL "uniques vérifications", "jeu de clé étrangère contrôles" et "alter table désactiver les touches"

nous avons un problème où un script mysqldump passe 90% de son temps à remplir une petite poignée de tables. L'élimination des FK et des index élimine le problème de vitesse, mais n'est pas une solution acceptable.

Le dump script ne ont:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

peut-on s'attendre à un comportement différent de ALTER TABLE foo DISABLE KEYS ?

Aussi, est disable keys session d'étendue ou est-il permanente jusqu'à ce que je la ré-active? Est-ce que je peux désactiver les clés d'une session mysql et avoir l'effet de l'importation émise d'une autre session?

5
demandé sur Pacerier 2009-08-20 20:45:35

2 réponses

Oui, vous devriez obtenir des avantages importants de DISABLE KEYS . Ce n'est pas une session-scoped, c'est une propriété de table, donc vos clés seront mortes pour tout le monde jusqu'à ce que vous fassiez ENABLE KEYS .

5
répondu chaos 2009-08-20 17:00:47

DISABLE KEYS est MyISAM seulement:

si vous utilisez ALTER TABLE sur une table MyISAM, tous les index non uniques sont créés dans un lot séparé (comme pour la table de réparation). Cela devrait rendre ALTER TABLE beaucoup plus rapide quand vous avez beaucoup d'indices.

cette fonctionnalité peut être activée explicitement pour une table MyISAM. ALTER TABLE ... DISABLE KEYS dit à MySQL d'arrêter de mettre à jour les index non uniques. ALTER TABLE ... Les touches ENABLE doivent alors être utilisées pour recréer les index manquants. MySQL le fait avec un algorithme spécial qui est beaucoup plus rapide que l'insertion de touches une par une, donc désactiver les touches avant d'effectuer des opérations d'insertion en vrac devrait donner une accélération considérable. À l'aide de l'instruction ALTER TABLE ... DISABLE KEYS nécessite le privilège INDEX en plus des privilèges mentionnés plus haut.

bien que les index non uniques soient désactivés, ils sont ignorés pour les instructions telles que SELECT et expliquer qu'autrement ils seraient utilisés.

à partir de Syntaxe ALTER TABLE

L'utilisation de DISABLE KEYS avec tout autre moteur de stockage entraîne un avertissement:

mysql> ALTER TABLE `foo` DISABLE KEYS;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings \G
*************************** 1. row ***************************
  Level: Note
   Code: 1031
Message: Table storage engine for 'foo' doesn't have this option
1 row in set (0.00 sec)
4
répondu sfussenegger 2012-11-15 10:41:41