MySQL requête « en va » sur exécution de l'instruction INSERT Duplicate UPDATE avec un blob de caractère 12524

dba.stackexchange https://dba.stackexchange.com/questions/8240

Question

J'ai un insert mysql sur requête de mise à jour comme si

insert into table (col1, col2, col3) values (1,2,'huge blob with 12524 chars') on duplicate key update col3 = 'huge blob with 12524 chars';
  • col1, col2 est une clé composite et il a l'index sur elle.
  • Il y a un total de 91 enregistrements dans la table
  • Tous les autres blobs dans le tableau ont moins de 1000 caractères
  • Si je donne col3 une faible valeur alors cette requête est exécutée instantanément
  • Si je donne une petite valeur dans la pièce d'insertion mais de grande valeur dans la partie de mise à jour, il faut 5 secondes pour exécuter
  • Si je donne de grande valeur en partie d'insertion mais faible valeur en deuxième partie, il meurt avec un délai d'attente de 1 minute.

Ce qui pourrait être à l'origine de cette requête à mourir sur l'exécution après avoir été bloqué pendant 1 minute? Que dois-je regarder?

Ce qui pourrait être à l'origine de cette requête de prendre si longtemps pour exécuter et mourir si la valeur de blob est énorme?

Était-ce utile?

La solution

Cela sonne comme vous devez augmenter la taille de votre Packets MySQL

Selon le la page 99 du "Comprendre MySQL Internes" (ISBN 0-596-00957- 7) , voici les paragraphes 1-3 expliquant:

Code de communication réseau MySQL a été écrit sous l'hypothèse que les requêtes sont toujours raisonnablement court, et peuvent donc être envoyés et traitées par le serveur dans un bloc, qui est appelé paquet dans MySQL terminologie. Le serveur Alloue la mémoire pour une mémoire tampon temporaire pour stocker le paquet, et il suffit de demande adapter entièrement. cette architecture nécessite une précaution pour éviter d'avoir le serveur manque de mémoire --- un capuchon la taille du paquet, qui présente l'option Accomplit.

Le code d'intérêt par rapport à cette option se trouve dans sql / net_serv.cc . Jetez un oeil à my_net_read () , puis suivre l'appel à my_real_read () et la rémunération une attention particulière à net_realloc () .

Cette variable limite également la longueur d'un résultat de nombreux functons à cordes. Voir sql / field.cc sql / intem_strfunc.cc pour plus de détails.

Depuis MySQL Les paquets peuvent contenir des lignes de données, de plus grands articles dans le paquet peut causer beaucoup de paquets à filtre-et-vient pour empêcher des morceaux entiers de données connexes de séparation au cours du traitement. Cela peut être un tueur silencieux de connexions DB sans raison apparente. Si fait, je l'ai écrit une afficher sur la façon dont cela peut affecter certains mysqldumps.

Essayez d'augmenter la max_allowed_packet (256M) à l'aide de la commande suivante:

SET max_allowed_packet = 1024 * 1024 * 256;
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top