MySQL: Truncate Table dans la Transaction?
J'ai une table InnoDB qui doit être re-rempli toutes les dix minutes à l'intérieur de n'importe où à partir de 60k à 200k enregistrements. Notre approche jusqu'à ce point a été comme suit:
- Désactiver la Validation automatique
- Tronquer la table
- Effectuer des Requêtes Select & Calculs supplémentaires (à l'aide de PHP)
- Insérer de nouveaux enregistrements
- Commettre
Après le Tronquer opération est effectuée cependant, les données sont immédiatement supprimé et n'est plus disponible à partir de l'Interface Utilisateur. Pour nos utilisateurs, cela a été assez déconcertant, même si dans un délai d'environ 30 secondes ou si le script rencontres de l'opération de validation et le tableau est rempli de nouveau.
J'ai pensé que je pourrais peut-être envelopper l'ensemble de l'opération, y compris la Truncate
, dans une transaction, et que cela pourrait réduire la durée de temps pendant laquelle le tableau est vide pour les utilisateurs. J'ai donc changé SET AUTOCOMMIT=0
à START TRANSCATION
.
Aïe! Cela a eu l'effet inverse de celui désiré! Maintenant, le TRUNCATE
opération se produit toujours au début du script, mais il faut beaucoup plus à l'exécution de la INSERT
opérations à l'intérieur de la transaction, de sorte que le temps que les COMMIT
opération prend de la place et les données de la table est de nouveau disponible, il a été près de dix minutes!
Ce qui pourrait éventuellement en être la cause? Honnêtement, je ne m'attendais pas à tout changement, parce que j'étais sous l'impression que le lancement d'une opération fondamentalement juste éteint Autocommit
de toute façon??
Vous devez vous connecter pour publier un commentaire.
Un meilleur moyen d'atteindre ce pourrait être pour insérer les données dans une nouvelle table, et ensuite utiliser renommer sur les deux tableaux afin de les échanger. Un seul renommer est tout ce qui est nécessaire pour le swap, et c'est une action atomique, ce qui signifie que les utilisateurs ne peuvent même pas être capable de détecter qu'il s'est passé, sauf pour les nouvelles données montrant. Ensuite, vous pouvez tronquer/supprimer les anciennes données.
DROP TABLE
sur la vieille après le changement de nom.RENAME table TO table_old, table_new TO table
et il a parfaitement fonctionné. J'ai eu le même "c'est hackish" le sentiment d'être au début, mais je ne pouvais pas voir tout inconvénient de cette approche.http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html
Selon cette URL, MySQL 5.1.32,
TRUNCATE TABLE
est DDL et PAS DML comme les SUPPRIMER. Cela signifie queTRUNCATE TABLE
va provoquer une impliciteCOMMIT
dans le milieu d'une transaction de bloc. Ainsi, l'utilisation deDELETE FROM
sur une table, vous avez besoin de vide au lieu deTRUNCATE TABLE
.Même
DELETE FROM tblname;
peut être annulée. Il pourrait prendre un certain temps à la restauration, alors assurez-InnoDB est correctement réglée pour traiter la transaction, le temps pour de telles possibilités de restauration.DELETE FROM table
etTRUNCATE table
n'est pas dans le temps d'exécution seulement.TRUNCATE
réinitialise égalementAUTO_INCREMENT
de la valeur à 1, cependantDELETE
ne le fait pas.À partir de votre description, je ne peux pas vraiment expliquer votre différence de temps. La seule chose qui vient à l'esprit est que vous n'avez pas fait l'enveloppent l'insère dans un transaction, mais la boucle.
La différence fondamentale avec les SET AUTOCOMMIT=0, c'est que si elle est déjà à 0, il ne le fera pas n'importe quoi, où, comme avec le DÉBUT de la TRANSACTION, vous lancerez une sous-transaction de la transaction en cours.