Tenho a seguinte query:
delete from tc_positions where servertime < date_add(now(), interval -$periodo month);
quem limpa registros de uma tabela (tc_positions) se a data do registro (encontrada pela coluna servertime) for maior que um período específico. Funciona perfeitamente para quase todos os meus sistemas. Porém, alguns sistemas que tem essa tabela muito maior, a query fica por 4 hrs executando e trava o banco de dados.
O tempo de execução é no máximo 10min, já que todos os dias é executada, não deixando acumular reistros antigos
Mas, este método usado é errado, pois a query está deletando registros de uma tabela baseada num campo que não é uma KEY. Por isso, um método, não indicado, seria desproteger o banco antes de executar a query e proteger novamente após a execução. Para isto é só adcionar set sql_safe_updates = 0; antes da query e set sql_safe_updates = 1; depois da query.
Este é o método unsafe, não indicado.
Outro meio é obter os registros que serão deletados e atribuir a uma variável com ID, assim o MySql deleta numa boa sem problemas. Vou dar um exemplo abaixo de uma query que tenho que foi convertida e funciona 100%
Modo 1
/* Comando para checar se o banco de dados está com a restrição de segurança habilitada. */
show variables like 'sql_safe_updates';
/* caso a restrição acima esteja habilitada, o comando abaixo desabilita a restrição de segurança.
*/
SET sql_safe_updates = 0;
/* Comando para atualizar o campo vazio para null sem referenciar o id (inseguro). */
update tc_devices set photo = null where photo = '';
/* habilita novamente a restrição de segurança, caso estivesse previamente habilitada. */
SET sql_safe_updates = 1;
Modo 2 (Indicado)
update tc_devices, (select id from tc_devices where
tc_devices.Photo = '') as tc_devices_aux set
tc_devices.Photo = null where
tc_devices.id =
tc_devices_aux.id;
É exatamente isto que eu quero só que com uma outra query que não consegui fazer a conversão me baseando nesta pois são funções diferentes.
Categoria: TI e Programação
Subcategoria: Programação
Qual é o alcance do projeto?: Bug ou alteração pequena
Isso é um projeto ou uma posição de trabalho?: Um projeto
Tenho, atualmente: Eu tenho especificações
Disponibilidade requerida: Conforme necessário
Funções necessárias: Desenvolvedor