Supondo que você use um mecanismo transacional (geralmente Innodb), limpe e preencha novamente a tabela na mesma transação.
Certifique-se de que seus leitores usem READ_COMMITTED ou nível de isolamento de transação mais alto (o padrão é REPEATABLE READ, que é mais alto).
Dessa forma, os leitores continuarão a poder ler o conteúdo antigo da tabela durante a atualização.
Existem alguns cuidados com os quais devemos ter cuidado:
- Se a tabela for tão grande que esgota a área de rollback - isso é possível se você atualizar toda (digamos) uma tabela de 1 milhão de linhas. Claro que isso é ajustável, mas há limites
- Se a transação falhar no meio do caminho e for revertida - reverter grandes transações é MUITO ineficiente no InnoDB (ele é otimizado para commits, não rollbacks)
- Tenha cuidado com impasses e tempos limite de espera de bloqueio, que são mais prováveis se você usar grandes transações.