Eu tenho um servidor MySQL Percona 8, rodando via Docker, atuando como armazenamento de dados de apoio para um serviço muito utilizado. A cada hora, será executado um script que lê um valor de uma coluna virtual de aproximadamente 1,7 milhão de linhas (estimativa de tamanho da tabela de 2,3 GiB) e insere esse valor específico e os dados-chave associados em outra tabela da qual o sistema, de outra forma, apenas lê. A coluna virtual é uma pesquisa JSON json_extract(jsonData, '$.root.interestingValue')
e possui o GENERATED
sinalizador. A ideia por trás disso é colocar menos pressão sobre a tabela que é considerada ativa e atualizada regularmente, quando os usuários estão interessados apenas em alguns valores específicos e não é necessário recuperar o valor mais recente absoluto.
A consulta é a seguinte (com tabelas/colunas renomeadas)
CREATE TEMPORARY TABLE t1_cache_temp
SELECT
t2.id as uid,
t3.displayText as dt,
t2.virtualColumn as interestingValue
FROM liveTable t2
JOIN otherLiveTable t3 on t2.id = t3.id;
TRUNCATE TABLE t1_cache;
INSERT INTO t1_cache
SELECT uid, dt, interestingValue FROM t1_cache_temp;
DROP TEMPORARY TABLE t1_cache_temp;
O tempo total gasto por este script é de 47 segundos.
Embora a leitura da tabela InnoDB e a gravação na tabela temporária sejam adequadas, a gravação na outra tabela InnoDB faz com que todas as outras operações no banco de dados sejam interrompidas após os primeiros segundos. Eu reduzi a INSERT INTO t1_cache...
instrução executando cada instrução individualmente.
Também tentei escrever em tabelas novas e completamente não utilizadas (também usando InnoDB), o que dá o mesmo resultado. No momento da realização do último teste, apenas 2% do Máximo de Conexões permitidas estão em uso. Além disso, apenas 48% do buffer pool do InnoDB estava em uso.
Se eu mudar a mesa para MyISAM, tudo funciona normalmente, sem interrupções ou travamentos. Além disso, se eu remover a tabela temporária, o mesmo problema ocorrerá, independentemente do mecanismo InnoDB ou MyISAM.
Embora usar MyISAM seja provavelmente a melhor opção, o que poderia estar causando isso? Há algo que eu possa fazer sobre isso no nível da configuração?