Eu tenho uma tabela com 100 milhões de linhas. Eu quero processar uma linha por vez em nenhuma ordem específica. Não quero carregar todos os dados na memória de uma vez e quero resultados parciais imediatos. Para eliminar possíveis problemas com a estrutura ORM que estou usando, pensei em testar minha capacidade de obter resultados parciais imediatos usando o mysql
cliente de linha de comando, da seguinte maneira:
mysql> select id from my_table \G
Mas o mysql
cliente fica lá por 75 segundos sem imprimir nada, crescendo para um tamanho final de 5,8 GB (relatado por top
), e então começa a imprimir os resultados. Durante a impressão dos resultados, o consumo de memória do mysql
processo cliente não muda (permanece em 5,8 GB).
Durante os primeiros 75 segundos, usando uma segunda mysql
sessão, posso ver que minha consulta está no sending data
estado. Quando o cliente começa a imprimir os resultados, o comando process (conforme relatado pelas show processlist
alterações de Query
para Sleep
.
Por que o mysql
cliente interativo espera para imprimir os resultados até que todos os resultados estejam disponíveis? Isso é um tremendo desperdício de RAM e não produz resultados parciais imediatos.
Invoque o cliente MySQL com a
--quick
opção.Veja https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_quick
O motivo pelo qual o padrão é armazenar o resultado no cliente está implícito nesta documentação. Se o cliente interativo estiver suspenso (por exemplo, usando o controle de trabalho Ctrl-Z), o MySQL Server deve usar recursos para manter o conjunto de resultados ativo.
Você deve considerar não buscar 100 milhões de linhas em uma única consulta para o cliente interativo.