Quais são as vantagens do Mnesia em relação às principais implementações de bancos de dados SQL e como elas diferem para elas?
Posso usar o banco de dados para armazenar grandes quantidades de dados sem degradação perceptível no desempenho?
feature-comparison
Yasir Arsanukaev
fonte
fonte
Respostas:
Desculpe por chegar atrasado à festa. :) Aqui está a minha resposta, com base no uso do Mnesia desde 1996 e em várias outras tecnologias de banco de dados desde 1988.
Mnesia e MySQL são realmente bestas diferentes, e qual é a melhor depende muito de como você pretende usá-lo.
Se o seu aplicativo estiver escrito em Erlang, o Mnesia permitirá que você armazene os dados no mesmo espaço de memória do seu aplicativo, o que significa que você pode buscar um único objeto de dados tão rapidamente quanto alguns microssegundos. Isso não é possível no MySQL, pois seu aplicativo e o banco de dados serão separados na memória. A razão pela qual o Mnesia pode fazer isso e ainda ser robusto é que Erlang implementa a 'proteção' da memória no nível do idioma.
No geral, os bancos de dados SQL tendem a favorecer a taxa de transferência sobre a latência e, quando se trata de latência, o Mnesia + Erlang geralmente é excelente. Você precisa decidir qual é o mais importante para você. Como diz a documentação (acima), os aplicativos de destino da Mnesia eram aplicativos de comutação de telecomunicações, onde os requisitos de tempo de resposta para, por exemplo, uma configuração de chamada, eram de aproximadamente 20 ms. Essencialmente, isso significava que você poderia ler do banco de dados apenas se os dados estivessem na memória compartilhada, mas evitaria gravar no armazenamento persistente com base na configuração por chamada. OTOH, esses aplicativos praticamente não precisam de suporte a consultas ad-hoc e não usam conjuntos de dados muito grandes. Algum trabalho foi feito para estender a adequação do Mnesia a outros domínios, mas isso não é uma prioridade para a equipe de desenvolvimento do Erlang / OTP. Mnesia é o que é e é provável que continue assim.
No link acima, onde Mnesia e MySQL são comparados em termos de velocidade, é preciso lembrar que está no eJabberd, que roda em um único servidor se for MySQL e executa um banco de dados totalmente replicado se for Mnesia - e grandes clusters de eJabberd podem ter até 10 ou mais nós erlang (e, portanto, 10 ou mais réplicas de Mnesia). Do ponto de vista da redundância, isso é bastante ridículo e caro, e o Mnesia de maneira alguma o obriga a fazê-lo. Obviamente, ele fornece leituras rápidas em cada nó, mas as gravações serão muito caras. Várias comparações que li acabaram comparando Mnesia distribuído com um MySQL de nó único; se a redundância não é necessária para o MySQL, também não deve ser necessária para o Mnesia. Mnesia é bastante flexível ao permitir que você escolha padrões de replicação, e a localização dos dados é transparente para o aplicativo.
Mnesia também não se limita a 2 GB por tabela (embora uma opção de armazenamento específica seja). O maior banco de dados de Mnesia que eu conheço tem cerca de 600 GB de dados em disco (RAM + 64 bits) - embora eu não recomende isso. Qualquer coisa de até 10 a 20 GB deve estar perfeitamente bem com o hardware moderno, mas pule inteiramente o disc_only_copies e use disc_copies - compre mais RAM, se necessário. Eu pensaria duas vezes antes de usar o suporte de sharding (mnesia_frag) - funciona, mas raramente vale a pena.
Talvez a maior diferença entre o Mnesia e o MySQL seja o próprio SQL: o Mnesia realmente não tem funcionalidade comparável; O QLC oferece algum suporte para consultas ad-hoc, mas não está na mesma liga que o SQL, nem o nível de otimização de consultas. Em ferramentas e provisionamento, o MySQL também é superior e, se você precisar de análises, não há dúvida de qual escolher (por exemplo, NÃO Mnésia).
A melhor maneira de visualizar o Mnesia é como uma extensão do idioma Erlang. Ele coloca os dados na ponta dos dedos e é excelente para pequenos conjuntos de dados em que a estrutura de dados e os padrões de acesso são bem conhecidos. Para esse propósito, usar o MySQL é tão desconfortável quanto usar o Mnesia para as coisas em que o MySQL funciona melhor.
A maioria dos aplicativos se enquadra em algum ponto intermediário, e é aqui que se torna uma chamada de julgamento. Você pode acabar usando os dois ...
fonte
A partir da documentação :
Mnesia versus MySQL, desempenho :
CouchDB v. Mnesia, V. MySQL e outros tópicos de Mnesia :
Em suma, ele foi projetado para fins muito específicos e parece bem projetado para se adequar ao objetivo. Nenhum banco de dados pode ser abstratamente comparado a outro. Somente através do uso de requisitos é possível induzir elementos de comensurabilidade.
fonte
Não, eu não diria que Mnesia é bom para grande quantidade de dados. Você pode optar por usar Ets ou Dets como back-end. Se você escolher Ets, seu banco de dados ficará na memória e muito rápido, mas os dados não serão persistentes. E se você deseja que seus dados sejam persistentes (salvos em disco), é necessário usar o Dets, que tem um limite de 2 GB , para que seu banco de dados não possa conter mais de 2 GB de dados.
Você pode usar um back-end personalizado, por exemplo, o innostore usado no banco de dados Riak NoSQL.
As vantagens do Mnesia é que ele é um banco de dados distribuído, portanto é muito fácil executar sistemas tolerantes a falhas se você tiver mais de um computador. E é muito fácil de usar no Erlang, pois é um banco de dados no idioma e age "como uma função". E também é super rápido se você só precisa de um banco de dados na memória, por exemplo, como um cache.
fonte