Imagine que temos uma tabela com 100 milhões de linhas e 80 GB de tamanho.
Cada linha tem coluna de texto e multiplica colunas inteiras.
definimos Innodb_buffer_pool_size para 40G
Estou executando esta Query:
select text,id,like_count from example where time > 'xxx-xx-xx' and time < 'xxx-xx-xx'
Portanto, se esta consulta precisar ler 50G de arquivo de dados (devido à consulta) e mover para o Buffer Pool. Eu quero saber como o buffer pool lida com esses dados.
porque definimos o buffer pool como 40G, mas a consulta precisa de 50G para lidar com isso.
Seu cenário soa exatamente como o que um mysqldump fará: Empurre todos os dados e páginas de índice para fora do InnoDB Buffer Pool. Você pode ver que este é o caso porque quando um mysqldump está em andamento, a lista de processos terá algo como
SELECT /*!N SQL_NO_CACHE */ from ...
. Veja um exemplo da aparência de um SELECT de um mysqldump no MySQL Slow Query Log - SELECT /*!N SQL_NO_CACHE */Faz sentido que qualquer varredura completa da tabela empurre todas as páginas de dados da tabela para o Buffer Pool, fazendo com que todas as páginas antigas do Buffer Pool sejam despejadas. Se você inserir 50 G de páginas de dados em seu Buffer Pool de 40 GB, seu Buffer Pool conterá os últimos 80% dessa tabela porque os primeiros 20% teriam sido inseridos no Buffer Pool e, em seguida, retirados. Eu mencionei cerca de 4 meses atrás (Veja meu post antigo É seguro executar dumps de transação única innodb paralelos de tabelas individuais? )
SUGESTÃO
Se seu objetivo é manter o conteúdo do Buffer Pool com a mesma aparência antes e depois de uma grande consulta, há apenas uma coisa que você pode fazer: despejar o mapa do Buffer Pool no disco, executar sua grande consulta e restaurar o Buffer Pool a partir do mapa.
Consulte a documentação do MySQL sobre essas opções