¿Qué significa cuando MySQL está en el estado "Envío de datos"?

163

¿Qué significa si la consulta Mysql:

SHOW PROCESSLIST;

devuelve "Enviando datos" en la columna Estado?

Me imagino que significa que la consulta se ha ejecutado y MySQL está enviando datos de "resultados" al cliente, pero me pregunto por qué lleva tanto tiempo (hasta una hora).

Gracias.

usuario1345414
fuente
1
Significa que está transmitiendo datos de su proceso al cliente. Si lo ve Sending datacomo un paso que lleva tiempo después de correr SHOW PROFILE, el tiempo consumido en realidad pertenece al paso anterior.
NB
Desafortunadamente, recibo un mensaje, la función 'MOSTRAR PERFIL' está deshabilitada, tengo que construir MySQL con 'habilitar perfil'. Pero gracias por su respuesta.
user1345414
Y es una pregunta adicional. La consulta ya ha finalizado internamente, ¿se trata de recursos para la transmisión como red o bus?
usuario1345414
3
No, no estás escuchando ... la razón que se Sending datamuestra como tomar tiempo es porque es un error de creación de perfiles de MySQL, el tiempo que se muestra allí pertenece al paso anterior, que debería ser Executing queryo algo similar. Simplemente significa que su consulta toma tiempo para ejecutarse. Sending dataEl paso suele ser rápido, a menos que transmita cientos de megabytes de datos.
NB
3
Quizás esa pregunta podría ser renombrada como "Qué significa el estado 'Enviar datos' en MySQL". Será más fácil encontrar la pregunta.
antitóxico

Respuestas:

249

Este es un estado bastante engañoso. Debería llamarse "leer y filtrar datos".

Esto significa que MySQLtiene algunos datos almacenados en el disco (o en la memoria) que aún no se han leído y enviado. Puede ser la tabla en sí, un índice, una tabla temporal, una salida ordenada, etc.

Si tiene una tabla de registros de 1M (sin un índice) de la que necesita solo un registro, MySQLseguirá mostrando el estado como "envío de datos" mientras escanea la tabla, a pesar de que todavía no ha enviado nada.

Quassnoi
fuente
12
La documentación que explica además que el razonamiento es más probable debido a mucho tiempo haciendo acceso al disco: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb el
44
¿Y si MySQL está "enviando datos" mientras usa 99% de CPU, con muy poca E / S de disco?
rustyx
@RustyX ¿Qué tal si los datos ya están presentes en el búfer en la RAM y están ordenando unas 100k o 1M de filas?
sjas
23

En este estado:

El hilo está leyendo y procesando filas para una instrucción SELECT , y enviando datos al cliente.

Debido a que las operaciones que ocurren durante este estado tienden a realizar grandes cantidades de acceso al disco (lecturas) .

Es por eso que lleva más tiempo completarlo y, por lo tanto, es el estado de ejecución más larga durante la vida útil de una consulta determinada.

Venkatesh Kalikiri
fuente