Qu'est-ce que cela signifie lorsque MySQL est dans l'état «Envoi de données»?

163

Qu'est-ce que cela signifie si la requête Mysql:

SHOW PROCESSLIST;

renvoie "Envoi de données" dans la colonne État?

J'imagine que cela signifie que la requête a été exécutée et que MySQL envoie des données de «résultat» au client, mais je me demande pourquoi cela prend autant de temps (jusqu'à une heure).

Je vous remercie.

user1345414
la source
1
Cela signifie qu'il transmet des données de son processus au client. Si vous voyez Sending datacomme une étape qui prend du temps après l'exécution, SHOW PROFILEle temps consommé appartient en fait à l'étape précédente.
NB
Malheureusement, je prends un message, la fonction 'SHOW PROFILE' est désactivée, je dois faire construire MySQL avec 'enable-profiling'. Mais merci pour votre réponse.
user1345414
Et c'est une question supplémentaire. La requête est déjà terminée en interne, s'agit-il de ressources pour la transmission comme le réseau ou le bus?
user1345414
3
Non, vous n'écoutez pas ... la raison qui Sending datamontre que cela prend du temps est que c'est un bogue de profilage MySQL, le temps affiché appartient à l'étape précédente, ce qui devrait être Executing queryou quelque chose de similaire. Cela signifie simplement que votre requête prend du temps à s'exécuter. Sending datal'étape est généralement rapide, sauf si vous diffusez des centaines de mégaoctets de données.
NB
3
Peut-être que cette question pourrait être renommée "Que signifie l'état" Envoi de données "dans MySQL". Il sera plus facile de trouver la question.
antitoxique le

Réponses:

249

C'est un statut assez trompeur. Il devrait être appelé "lecture et filtrage des données".

Cela signifie que MySQLcertaines données sont stockées sur le disque (ou en mémoire) qui doivent encore être lues et envoyées. Il peut s'agir de la table elle-même, d'un index, d'une table temporaire, d'une sortie triée, etc.

Si vous avez une table d'enregistrements de 1M (sans index) dont vous n'avez besoin que d'un seul enregistrement, MySQLaffichera toujours l'état "envoi de données" lors de l'analyse de la table, malgré le fait qu'elle n'a encore rien envoyé.

Quassnoi
la source
12
La documentation qui explique en outre que le raisonnement est probablement dû au temps passé à accéder au disque: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb
4
Et si MySQL "envoie des données" tout en utilisant 99% du CPU, avec très peu d'E / S disque?
rustyx
@RustyX Que diriez-vous que les données soient déjà présentes dans la mémoire tampon de la RAM et qu'elles trient environ 100k ou 1M de lignes?
sjas
23

Dans cet état:

Le thread lit et traite des lignes pour une instruction SELECT et envoie des données au client.

Parce que les opérations se produisant pendant cet état ont tendance à effectuer de grandes quantités d'accès au disque (lectures) .

C'est pourquoi cela prend plus de temps, tout comme l' état le plus long sur la durée de vie d'une requête donnée.

Venkatesh Kalikiri
la source