Vamos instalar um servidor web que grava logs de acesso em uma tabela MySQL. Os logs de acesso, é claro, ficarão realmente muito grandes, portanto, esta será uma instância separada do MySQL dos dados regulares e excluiremos os binlogs de maneira mais livre.
Também teremos que excluir itens mais antigos da tabela, o que significa excluir comandos e otimizar comandos que farão as inserções esperarem.
Existe uma maneira de ter inserções atrasadas que estão em uma ordem preservada e que ocasionalmente toleram muitos itens na fila de inserção atrasada?
Se as inserções se misturarem, isso não é um impedimento. Podemos usar timestamps e milissegundos para classificação.
Além disso, podemos evitar o crescimento desnecessário de arquivos de índice? Talvez possamos otimizar os índices de forma semelhante à otimização dos arquivos de dados? Exigir que os índices tenham largura fixa evitaria problemas de desperdício de rotação de dados?
FWIW, acho que esta é a maneira errada de fazer isso; a menos que você precise fazer relatórios em tempo real sobre o acesso ao servidor da web, grave o log como um arquivo e carregue-o em massa.
Dito isso, existe uma maneira de fazer o que você deseja, que se bem entendi é enfileirar inserções pendentes enquanto faz manutenção em seu banco de dados. Em outras palavras, desacoplar a
INSERT
operação do servidor web do realINSERT
no banco de dados em algum tipo de buffer. A maneira de fazer isso usando duas instâncias, uma que é gravada diretamente na qual você usará o mecanismo de armazenamento blackhole e outra para a qual você replicará , que será seu banco de dados "real". As inserções pendentes viverão nos binlogs; você simplesmente para de replicar para o escravo, executa sua manutenção e, em seguida, retoma a replicação novamente e o banco de dados escravo/real é atualizado. O escravo está disponível porSELECT
s para seus relatórios. Você também podemulti-mestre para balanceamento de carga, ou ter vários escravos e alternar entre eles durante as atividades de manutenção.