主要なSQLデータベースの実装に対するMnesiaの利点は何ですか?それとそれらの違いは何ですか?
データベースを使用して、パフォーマンスを著しく低下させることなく、非常に大量のデータを保持できますか?
パーティーに遅れてすみません。 :) 1996年以来Mnesiaを使用し、1988年以来他のさまざまなデータベーステクノロジーを使用してきたことに基づく私の答えは次のとおりです。
MnesiaとMySQLは確かに別の獣であり、どちらが最良かは、それをどのように使用するかによって大きく異なります。
アプリケーションがErlangで記述されている場合、Mnesiaを使用すると、アプリケーションと同じメモリ空間にデータを格納できます。つまり、単一のデータオブジェクトを数マイクロ秒ですばやくフェッチできます。アプリケーションとデータベースはメモリ内で分離されるため、これはMySQLでは不可能です。 Mnesiaがこれを実行でき、しかも堅牢である理由は、Erlangが言語レベルでメモリの「保護」を実装しているためです。
全体として、SQLデータベースはレイテンシよりもスループットを優先する傾向があり、レイテンシに関しては、Mnesia + Erlangは一般的に優れています。あなたはどちらがあなたにとって最も重要であるかを決める必要があります。ドキュメント(上記)で述べられているように、Mnesiaのターゲットアプリケーションはテレコムスイッチングアプリケーションでした。コールセットアップは約20ミリ秒でした。これは基本的に、データが共有メモリにある場合にのみデータベースから読み取ることができ、呼び出しごとのセットアップで永続ストレージに書き込むことを回避することを意味しました。 OTOH、これらのアプリケーションは、アドホッククエリサポートを事実上必要とせず、非常に大きなデータセットを使用しません。 Mnesiaのその他のドメインへの適合性を拡張するためにいくつかの作業が行われましたが、Erlang/OTP開発チームの優先事項ではありません。 Mnesiaはそれが何であるかであり、そのようにとどまる可能性が高いです。
MnesiaとMySQLの速度を比較する上記のリンクでは、それがeJabberdにあることを覚えておく必要があります。これは、MySQLの場合は単一のサーバーに対して実行され、Mnesiaの場合は完全に複製されたデータベースを実行します。大規模なeJabberdクラスターは、 10以上のアーランノード(したがって、10以上のMnesiaレプリカ)。冗長性の観点から見ると、これはかなりばかげてコストがかかります。Mnesiaが強制することは決してありません。各ノードで明らかに高速な読み取りを提供しますが、書き込みは非常に高価になります。私が読んだいくつかの比較は、分散Mnesiaを単一ノードのMySQLと比較してしまいました。 MySQLに冗長性が必要ない場合、Mnesiaにも冗長性は必要ありません。 Mnesiaは、レプリケーションパターンの選択が非常に柔軟で、データの場所はアプリケーションに対して透過的です。
Mnesiaは、テーブルごとに2 GBにも制限されていません(ただし、特定のストレージオプションはそうです)。私が知っている最大のMnesiaデータベースでは、(64ビット)RAM +ディスクに約600 GBのデータがありますが、これはお勧めしません。ただし、最新のハードウェアでは10〜20 GBまでであれば問題ありませんが、disc_only_copiesを完全にスキップして、disc_copiesを使用します。必要に応じて、さらにRAMを購入します。シャーディングを使用する前に、もう一度考えます。サポート(mnesia_frag)-動作しますが、問題が発生することはほとんどありません。
おそらく、MnesiaとMySQLの最大の違いはSQL自体です。Mnesiaには同等の機能はありません。 QLCはアドホッククエリの一部のサポートを提供しますが、SQLと同じレベルではなく、クエリ最適化のレベルでもありません。ツールとプロビジョニングでは、MySQLも優れており、分析が必要な場合、どちらを選択すればよいか(Mnesiaではない)は問題ありません。
Mnesiaを表示する最良の方法は、Erlang言語の拡張としてです。データをすぐに利用でき、データ構造とアクセスパターンがよく知られている小さなデータセットに最適です。この目的のために、MySQLを使用することは、MySQLが最適に機能するためにMnesiaを使用するのと同じくらい不快です。
ほとんどのアプリケーションはその中間にあり、ここが判断の呼びかけになります。両方を使用することになるかもしれません...
ドキュメント から:
Mnesiaは、継続的な運用とソフトリアルタイムプロパティを必要とするテレコミュニケーションアプリケーションやその他のErlangアプリケーションに適した分散データベース管理システムです。これは、電気通信アプリケーションを構築するための制御システムプラットフォームであるOpen Telecom Platform(OTP)の1つのセクションです。
特に、多くのノンストップシステムで必要とされる非常に高いレベルのフォールトトレランスと、アプリケーションと同じアドレススペースで実行するためのDBMSの要件との組み合わせにより、まったく新しいDBMSが実装されました。 Mnesiaと呼ばれます。 Mnesiaはプログラミング言語Erlangで実装され、非常に緊密に接続されており、フォールトトレラントな通信システムの実装に必要な機能を提供します。 Mnesiaは、目的のターゲット言語でもあるシンボリックプログラミング言語Erlangで記述された産業用電気通信アプリケーション用に特別に作成されたマルチユーザー分散DBMSです。 Mnesiaは、典型的なテレコミュニケーションシステムに必要なすべてのデータ管理問題に対処しようとしますが、従来のデータベースには通常見られない多くの機能を備えています。
電気通信アプリケーションでは、従来のDBMSが提供する機能とは異なるニーズがあります。現在Erlang言語で実装されているアプリケーションには、従来のDBMSでは一般的に満たされていない幅広い機能を混在させる必要があります。 Mnesiaは、次のような要件を考慮して設計されています。
高速なリアルタイムのキー/値ルックアップ
主に運用と保守のための複雑な非リアルタイムクエリ
分散アプリケーションによる分散データ
高いフォールトトレランス
動的再構成
複雑なオブジェクト
Mnesiaを他のほとんどのDBMSと差別化するのは、Mnesiaが電気通信アプリケーションの一般的なデータ管理の問題を考慮して設計されていることです。したがって、Mnesiaは、トランザクションやクエリなどの従来のデータベースにある多くの概念と、超高速リアルタイム操作、構成可能なフォールトトレランス(複製による)や、システムを停止または一時停止せずにシステムを再構成します。 Mnesiaも興味深いのは、プログラミング言語Erlangと密接に結びついているため、Erlangをデータベースプログラミング言語にほぼ変えていることです。これには多くの利点があります。何よりもまず、DBMSが使用するデータ形式と、データの操作に使用されるプログラミング言語が使用するデータ形式の間のインピーダンスの不一致が完全になくなることです。
一部の* SQLデータベースを使用する場合、ejabberdは、内部Mnesiaを使用する場合よりも少ない計算リソースを消費します。多数の同時ユーザー(たとえば、1000人を超えるユーザー)がいる場合は、おそらくそのトピックに関心があります。同時ユーザーが少ない場合、ejabberdのCPU消費はごくわずかなので、小規模サーバーの管理者は外部SQLサーバーとデータベースをセットアップする必要はありません。
CouchDB v。Mnesia、V。MySQL および 他のMnesiaトピック :
すぐに頭に浮かんだ洞察の1つは、MySQLのデータをどのように構造化するかは明らかに明白でしたが、Mnesiaの場合はそれほどではなく、CouchDBの場合はまだ最善のアプローチが完全に定かではないということです。とりあえず、ここではより明白なポイントをいくつか示します。
「レコード」には「numplays」フィールドがあり、明らかに何回再生されたかを示します。これはMySQLでは問題ありませんが、このフィールドをCouchDBのドキュメントに組み込むだけの場合、この1つの番号が変更されるたびにデータベース内のドキュメントの完全な複製リビジョンが取得されるため、非常に非効率的です。
MySQLの3つのテーブルレイアウトのレコード、タグ、およびそれらの間のリンクテーブル(これが明確でない場合はスクリプトを参照してください)は(少なくとも私には)明らかに正しいソリューションですが、これを行うには多くの可能な方法があります。 MnesiaとCouchDBの両方で、私は直感的に答えを見つけることができません。
要するに、それは非常に特定の目的のために設計されており、目的に合うようにうまく設計されているようです。あるデータベースを別のデータベースと抽象的に比較することはできません。要件を使用することによってのみ、通約性の要素を誘導できます。
いいえ、Mnesiaが大量のデータに適しているとは言えません。 EtsまたはDets をバックエンドとして使用することを選択できます。 Etsを選択すると、データベースはメモリ内にあり、非常に高速になりますが、データは永続的ではありません。データを永続化(ディスクに保存)したい場合は、2GB制限のあるDetsを使用する必要があるため、データベースはこれ以上保持できません2GB以上のデータ。
カスタムバックエンドを使用できます。 innostoreRiak NoSQLデータベースで使用されます。
Mnesiaの利点は、分散データベースであるため、複数のコンピューターがある場合にフォールトトレラントシステムを非常に簡単に実行できることです。また、Erlangは言語内データベースであり、「関数のように」機能するため、Erlangでの使用は非常に簡単です。また、インメモリデータベースのみが必要な場合も、超高速です。キャッシュのように。