Was sind die Vorteile von Mnesia gegenüber großen SQL-Datenbankimplementierungen und wie unterscheidet es sich von diesen?
Kann ich die Datenbank verwenden, um wirklich große Datenmengen zu speichern, ohne dass sich die Leistung merklich verschlechtert?
feature-comparison
Yasir Arsanukaev
quelle
quelle
Antworten:
Entschuldige, dass du zu spät zur Party gekommen bist. :) Hier ist meine Antwort, basierend auf der Verwendung von Mnesia seit 1996 und verschiedenen anderen Datenbanktechnologien seit 1988.
Mnesia und MySQL sind in der Tat verschiedene Biester, und welches das beste ist, hängt sehr davon ab, wie Sie es verwenden möchten.
Wenn Ihre Anwendung in Erlang geschrieben ist, können Sie mit Mnesia die Daten im selben Speicherbereich wie Ihre Anwendung speichern, sodass Sie ein einzelnes Datenobjekt innerhalb weniger Mikrosekunden abrufen können. Dies ist in MySQL nicht möglich, da Ihre Anwendung und die Datenbank im Speicher getrennt werden. Der Grund, warum Mnesia dies kann und dennoch robust ist, besteht darin, dass Erlang den Speicherschutz auf Sprachebene implementiert.
Insgesamt bevorzugen SQL-Datenbanken den Durchsatz gegenüber der Latenz, und wenn es um die Latenz geht, sind Mnesia + Erlang im Allgemeinen hervorragend. Sie müssen sich entscheiden, welches für Sie am wichtigsten ist. Wie es in den Dokumenten (oben) heißt, waren Mnesias Zielanwendungen Telekommunikationsvermittlungsanwendungen, bei denen die Anforderungen an die Antwortzeit für z. B. einen Anrufaufbau etwa 20 ms betrugen. Dies bedeutete im Wesentlichen, dass Sie nur dann aus der Datenbank lesen konnten, wenn sich die Daten im gemeinsam genutzten Speicher befanden, aber das Schreiben in einen dauerhaften Speicher auf der Basis von Aufrufen vermeiden konnten. OTOH, diese Anwendungen benötigen praktisch keine Unterstützung für Ad-hoc-Abfragen und verwenden keine sehr großen Datenmengen. Es wurden einige Anstrengungen unternommen, um die Eignung von Mnesia für andere Domänen zu verbessern. Für das Erlang / OTP-Entwicklungsteam hat dies jedoch keine Priorität. Mnesia ist, was es ist, und wird wahrscheinlich so bleiben.
In dem obigen Link, in dem Mnesia und MySQL aus Geschwindigkeitsgründen verglichen werden, muss beachtet werden, dass es sich um eJabberd handelt, das auf einem einzelnen Server ausgeführt wird, wenn es sich um MySQL handelt, und eine vollständig replizierte Datenbank ausführt, wenn es sich um Mnesia handelt 10 oder mehr Langknoten (und damit 10 oder mehr Mnesia-Replikate). Vom Standpunkt der Redundanz aus ist dies ziemlich lächerlich und kostspielig, und Mnesia zwingt Sie keineswegs dazu. Es gibt offensichtlich unglaublich schnelle Lesevorgänge auf jedem Knoten, aber Schreibvorgänge sind sehr teuer. Mehrere Vergleiche, die ich gelesen habe, haben ergeben, dass verteilte Mnesia mit einem einzelnen MySQL-Knoten verglichen wurden. Wenn für MySQL keine Redundanz erforderlich ist, sollte dies auch für Mnesia nicht erforderlich sein. Mnesia ist sehr flexibel bei der Auswahl von Replikationsmustern, und der Speicherort der Daten ist für die Anwendung transparent.
Mnesia wird auch auf 2 GB pro Tabelle nicht beschränkt (obwohl eine bestimmte Speicher Option ist). Die größte mir bekannte Mnesia-Datenbank verfügt über ca. 600 GB Daten im (64-Bit) RAM + Datenträger - obwohl ich dies nicht empfehle. Alles bis zu 10-20 GB sollte mit moderner Hardware vollkommen in Ordnung sein, aber lassen Sie disc_only_copies komplett aus und verwenden Sie disc_copies - kaufen Sie mehr RAM, wenn Sie müssen. Ich würde es mir zweimal überlegen, bevor ich die Sharding-Unterstützung (mnesia_frag) benutze - es funktioniert, aber die Mühe lohnt sich selten.
Der vielleicht größte Unterschied zwischen Mnesia und MySQL ist SQL selbst: Mnesia hat keine wirklich vergleichbare Funktionalität; QLC bietet eine gewisse Unterstützung für Ad-hoc-Abfragen, gehört jedoch nicht zur selben Liga wie SQL, und auch nicht zum Grad der Abfrageoptimierung. In Sachen Tooling und Provisioning ist MySQL ebenfalls überlegen, und wenn Sie Analysen benötigen, steht außer Frage, welches Sie wählen sollten (dh NICHT Mnesia).
Die beste Möglichkeit, Mnesia zu betrachten, ist die Erweiterung der Erlang-Sprache. Sie haben Daten immer zur Hand und eignen sich hervorragend für kleine Datenmengen, bei denen die Datenstruktur und die Zugriffsmuster bekannt sind. Zu diesem Zweck ist die Verwendung von MySQL ungefähr so unkomfortabel wie die Verwendung von Mnesia für die Dinge, bei denen MySQL am besten funktioniert.
Die meisten Anwendungen liegen irgendwo dazwischen, und hier wird es zu einem Urteilsspruch. Sie können gut mit beiden enden ...
quelle
Aus der Dokumentation :
Mnesia versus MySQL, Leistung :
CouchDB v. Mnesia, V. MySQL und andere Mnesia-Themen :
Kurz gesagt, es wurde für einen ganz bestimmten Zweck entwickelt und scheint für diesen Zweck gut geeignet zu sein. Keine Datenbank kann abstrakt mit einer anderen verglichen werden. Nur durch die Verwendung von Anforderungen können Elemente der Verhältnismäßigkeit induziert werden.
quelle
Nein, ich würde nicht sagen, dass Mnesia für große Datenmengen gut ist. Sie können Ets oder Dets als Backend verwenden. Wenn Sie Ets wählen, befindet sich Ihre Datenbank nur im Arbeitsspeicher und ist sehr schnell, die Daten sind jedoch nicht persistent. Und wenn Sie möchten, dass Ihre Daten dauerhaft (auf der Festplatte gespeichert) sind, müssen Sie Dets verwenden, das eine Beschränkung von 2 GB hat , sodass Ihre Datenbank nicht mehr als 2 GB Daten enthalten kann.
Sie können ein benutzerdefiniertes Backend verwenden, z. B. innostore , das in der Riak NoSQL-Datenbank verwendet wird.
Der Vorteil von Mnesia besteht darin, dass es sich um eine verteilte Datenbank handelt, sodass es sehr einfach ist, fehlertolerante Systeme zu erstellen, wenn Sie mehr als einen Computer haben. Und es ist sehr einfach in Erlang zu verwenden, da es eine in der Sprache verfügbare Datenbank ist und "wie eine Funktion" funktioniert. Und es geht auch superschnell, wenn Sie nur eine In-Memory-Datenbank benötigen, z. B. einen Cache.
quelle