Quels sont les avantages de Mnesia par rapport aux principales implémentations de bases de données SQL et en quoi elles diffèrent?
Puis-je utiliser la base de données pour stocker de très grandes quantités de données sans dégradation notable des performances?
feature-comparison
Yasir Arsanukaev
la source
la source
Réponses:
Désolé d'être en retard à la fête. :) Voici ma réponse, basée sur l'utilisation de Mnesia depuis 1996 et de diverses autres technologies de base de données depuis 1988.
Mnesia et MySQL sont en effet des bêtes différentes, et laquelle est la meilleure dépend beaucoup de la façon dont vous comptez l'utiliser.
Si votre application est écrite en Erlang, Mnesia vous permet de stocker les données dans le même espace mémoire que votre application, ce qui signifie que vous pouvez récupérer un seul objet de données aussi rapidement que quelques microsecondes. Ce n'est pas possible dans MySQL, car votre application et la base de données seront séparées en mémoire. La raison pour laquelle Mnesia peut faire cela et être encore robuste, c'est qu'Erlang implémente la «protection» de la mémoire au niveau de la langue.
Dans l'ensemble, les bases de données SQL ont tendance à favoriser le débit par rapport à la latence, et en matière de latence, Mnesia + Erlang sont généralement exceptionnelles. Vous devez décider lequel est le plus important pour vous. Comme il est dit dans les documents (ci-dessus), les applications cibles de Mnesia étaient des applications de commutation de télécommunications, où les exigences de temps de réponse pour, par exemple, une configuration d'appel étaient d'environ 20 ms. Cela signifiait essentiellement que vous ne pouviez lire à partir de la base de données que si les données étaient dans la mémoire partagée, mais éviteriez d'écrire sur le stockage persistant sur une base de configuration par appel. OTOH, ces applications n'ont pratiquement pas besoin de prise en charge de requêtes ad hoc et n'utilisent pas de très grands ensembles de données. Certains travaux ont été effectués pour étendre l'adéquation de Mnesia à d'autres domaines, mais ce n'est pas une priorité pour l'équipe de développement d'Erlang / OTP. La mnésie est ce qu'elle est et est susceptible de rester ainsi.
Dans le lien ci-dessus où Mnesia et MySQL sont comparés pour la vitesse, il faut se rappeler qu'il est dans eJabberd, qui s'exécute sur un seul serveur si c'est MySQL et exécute une base de données entièrement répliquée si c'est Mnesia - et les grands clusters eJabberd peuvent avoir autant que 10 nœuds erlang ou plus (et donc, 10 répliques Mnesia ou plus). Du point de vue de la redondance, c'est assez ridicule et coûteux, et Mnesia ne vous y oblige en aucun cas. Il donne évidemment des lectures rapides sur chaque nœud, mais les écritures seront très coûteuses. Plusieurs comparaisons que j'ai lues ont fini par comparer la Mnesia distribuée avec un MySQL à nœud unique; si la redondance n'est pas nécessaire pour MySQL, elle ne devrait pas l'être non plus pour Mnesia. Mnesia est assez flexible pour vous permettre de choisir des modèles de réplication et l'emplacement des données est transparent pour l'application.
Mnesia n'est pas non plus limité à 2 Go par table (bien qu'une option de stockage particulière le soit). La plus grande base de données Mnesia que je connaisse a environ 600 Go de données dans (64 bits) RAM + disque - bien que je ne le recommande pas. Tout ce qui peut aller jusqu'à 10-20 Go devrait être parfaitement adapté au matériel moderne, mais ignorez entièrement disc_only_copies et utilisez disc_copies - achetez plus de RAM si vous le devez. J'y réfléchirais à deux fois avant d'utiliser le support de partitionnement (mnesia_frag) - cela fonctionne, mais vaut rarement la peine.
La plus grande différence entre Mnesia et MySQL est peut-être SQL lui-même: Mnesia n'a pas vraiment de fonctionnalités comparables; QLC offre un certain support pour les requêtes ad-hoc, mais ce n'est pas dans la même ligue que SQL, ni le niveau d'optimisation des requêtes. Dans l'outillage et l'approvisionnement, MySQL est également supérieur, et si vous avez besoin d'analyses, il ne fait aucun doute lequel vous devez choisir (c.-à-d. PAS Mnesia).
La meilleure façon de voir Mnesia est une extension de la langue Erlang. Il met les données à portée de main et est excellent pour les petits ensembles de données où la structure des données et les modèles d'accès sont bien connus. À cette fin, l'utilisation de MySQL est à peu près aussi inconfortable que l'utilisation de Mnesia pour les choses où MySQL fonctionne le mieux.
La plupart des demandes se situent quelque part entre les deux, et c'est là que cela devient un appel au jugement. Vous pourriez bien finir par utiliser les deux ...
la source
De la documentation :
Mnesia contre MySQL, performances :
CouchDB v. Mnesia, V. MySQL et autres sujets Mnesia :
En bref, il est conçu pour un usage très spécifique et semble bien conçu pour répondre à cet objectif. Aucune base de données ne peut être comparée de manière abstraite à une autre. Ce n'est qu'en utilisant des exigences que des éléments de commensurabilité peuvent être induits.
la source
Non, je ne dirais pas que Mnesia est bon pour une grande quantité de données. Vous pouvez choisir d'utiliser Ets ou Dets comme backend. Si vous choisissez Ets, votre base de données sera uniquement en mémoire et très rapide mais les données ne sont pas persistantes. Et si vous voulez que vos données soient persistantes (enregistrées sur le disque), vous devez utiliser Dets, qui a une limite de 2 Go , de sorte que votre base de données ne peut pas contenir plus de 2 Go de données.
Vous pouvez utiliser un backend personnalisé, par exemple innostore, qui est utilisé dans la base de données Riak NoSQL.
Les avantages de Mnesia sont qu'il s'agit d'une base de données distribuée, il est donc très facile de faire des systèmes tolérants aux pannes si vous avez plus d'un ordinateur. Et il est très facile à utiliser dans Erlang car c'est une base de données en langue et agit "comme une fonction". Et il est également ultra-rapide si vous n'avez besoin que d'une base de données en mémoire, comme un cache par exemple.
la source