O que significa quando o MySQL está no estado "Enviando Dados"?

163

O que significa se a consulta Mysql:

SHOW PROCESSLIST;

retorna "Enviando dados" na coluna Estado?

Eu imagino que isso significa que a consulta foi executada e o MySQL está enviando dados de "resultado" para o cliente, mas estou me perguntando por que está demorando tanto tempo (até uma hora).

Obrigado.

user1345414
fonte
1
Significa que está transmitindo dados de seu processo para o cliente. Se você está vendo Sending datauma etapa que demora algum tempo após a execução SHOW PROFILE, o tempo consumido realmente pertence à etapa anterior.
NB
Infelizmente eu recebo uma mensagem, o recurso 'SHOW PROFILE' está desabilitado, eu tenho que construir o MySQL com 'enable-profiling'. Mas obrigado por sua resposta.
usar o seguinte comando
E é uma pergunta adicional. A Consulta já terminou internamente, é uma questão de recursos para transmissão como rede ou barramento?
usar o seguinte comando
3
Não, você não está ouvindo .. o motivo que Sending datamostra o tempo gasto é porque é um bug no perfil do MySQL, o tempo mostrado lá pertence à etapa anterior, que deve ser Executing queryou algo semelhante. Significa apenas que sua consulta demora para ser executada. Sending dataEssa etapa geralmente é rápida, a menos que você transmita centenas de megabytes de dados.
NB
3
Talvez essa pergunta possa ser renomeada para "O que significa o estado 'Enviando dados' no MySQL". Será mais fácil encontrar a pergunta.
Antitoxic

Respostas:

249

Este é um status bastante enganador. Deve ser chamado de "leitura e filtragem de dados".

Isso significa que MySQLexistem alguns dados armazenados no disco (ou na memória) que ainda precisam ser lidos e enviados. Pode ser a própria tabela, um índice, uma tabela temporária, uma saída classificada etc.

Se você tiver uma tabela de registros de 1 milhão (sem um índice) da qual você precisa apenas de um registro, MySQLainda emitirá o status como "enviando dados" durante a varredura da tabela, apesar de ainda não ter enviado nada.

Quassnoi
fonte
12
A documentação que explica ainda que o raciocínio é provavelmente por causa de um monte de tempo fazendo acesso ao disco: dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb
4
E se o MySQL estiver "enviando dados" enquanto usa 99% da CPU, com muito pouca E / S de disco?
rustyx
@RustyX Que tal os dados já estarem presentes no buffer na RAM e classificarem cerca de 100k ou 1M de linhas?
sjas
23

Neste estado:

O encadeamento está lendo e processando linhas para uma instrução SELECT e enviando dados para o cliente.

Como as operações que ocorrem durante esse estado tendem a executar grandes quantidades de acesso ao disco (leituras) .

É por isso que leva mais tempo para concluir e também é o estado de execução mais longa ao longo da vida útil de uma determinada consulta.

Venkatesh Kalikiri
fonte