Observando a lista de disponibilidade de recursos em http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html, dois possíveis problemas aparecem :
- Nenhuma transação ou suporte a FK, o que significa que você terá que gerenciar a integridade transacional e a integridade referencial em seu próprio código foram necessários (o que pode acabar sendo muito menos eficiente do que permitir que o banco de dados faça isso por você, embora isso dependa muito do aplicativo padrões de comportamento esperados).
- Somente bloqueio no nível da tabela: isso pode ser uma barreira significativa à escalabilidade se o aplicativo precisar de vários gravadores simultâneos no mesmo conjunto de tabelas ou nos casos em que suas operações de leitura usem bloqueios para garantir a leitura de dados consistentes - nesses casos, uma tabela baseada em disco que suporta uma granularidade de bloqueio muito mais fina terá um desempenho muito melhor se o conteúdo suficiente estiver atualmente armazenado em cache na RAM.
Fora isso, supondo que você tenha RAM suficiente, uma tabela baseada em memória deve ser mais rápida que uma tabela baseada em disco. Obviamente, você precisa levar em consideração as capturas instantâneas em disco para resolver o problema do que acontece quando a instância do servidor é redefinida, o que provavelmente negará completamente o benefício geral de desempenho se os dados precisarem ser capturados com frequência (se você puder perder um dia de trabalho dados nesse caso, você pode fazer um backup apenas uma vez por dia, mas na maioria dos casos isso não seria aceitável).
Uma alternativa pode ser:
- Use tabelas baseadas em disco, mas verifique se você possui RAM mais do que suficiente para mantê-las na RAM a qualquer momento (e "RAM suficiente" pode ser mais do que você pensa, pois precisa prestar contas de outros processos na máquina, SO Buffers de E / S / cache e assim por diante)
- Digitalize todo o conteúdo (todos os dados e páginas de índice) da tabela em cada inicialização para pré-carregar o conteúdo na memória com
SELECT * FROM <table> ORDER BY <pkey fields>
cada tabela seguida por SELECT <indexed fields> FROM <table> ORDER BY <index fields>
cada índice
Dessa forma, todos os seus dados estão na RAM, você só precisa se preocupar com o desempenho de E / S para operações de gravação. Se o conjunto de trabalho comum do seu aplicativo for muito menor do que o banco de dados inteiro (o que geralmente acontece) - na maioria dos aplicativos, a maioria dos usuários só olha os dados mais recentes se houver tempo - é melhor você ser mais seletivo quanto a quanto você digitaliza para pré-carregar na memória, permitindo que o restante seja carregado do disco sob demanda.