Temos uma tabela mysql que a qualquer momento tem cerca de 12 milhões de linhas. Precisamos excluir dados antigos para manter o tamanho da tabela um pouco gerenciável.
No momento, estamos executando esta consulta diariamente, à meia-noite, usando um trabalho cron:
DELETE FROM table WHERE endTime < '1393632001'
A última vez que a consulta foi executada, examinou 4.602.400, levou mais de 3 minutos e a CPU passou pelo telhado.
O que podemos fazer para impedir que a CPU, as conexões de banco de dados síncronas, a profundidade das sugestões de disco, etc. sejam disparadas de maneira não razoável, enquanto ainda limpam dados antigos?
PS: Você notará que a consulta está realmente acontecendo em um momento bastante inoportuno do nosso ciclo de uso. Suponha que já alteramos o tempo da consulta para ocorrer no ponto mais baixo de uso a cada dia. Além disso, não há índice no "endTime" e eu preferiria mantê-lo dessa maneira, se possível, porque há uma tonelada de dados sendo inseridos com muita regularidade e pouca pesquisa.
Respostas:
A solução para o seu problema é um recurso do MySQL chamado "particionamento". A documentação está aqui .
O que o particionamento faz é armazenar uma única tabela em "partições" separadas. Eles são definidos por uma expressão específica, geralmente um valor ou intervalo da coluna. No seu caso, isso provavelmente se baseará
endTime
- assumindo que ele é conhecido quando um registro é criado e não muda.Você armazenaria o valor de um dia
endTime
em cada partição. Em seguida, a etapa de exclusão truncaria uma partição em vez de excluir várias linhas em uma grande tabela. O truncamento da partição seria um método muito mais rápido.fonte