3

Mnesia には、データベースから読み取る 4 つの方法がreadあります。もちろん、それらの汚い相手に加えて。それらのそれぞれは、以前のものよりも表現力豊かです。match_objectselectqlc

  1. それらのどれがインデックスを使用していますか?
  2. このメソッドのいずれかでクエリを実行すると、より表現力の高いメソッドで同じクエリを実行すると、時間/メモリの使用効率が低下しますか? いくら?

アップデート。I GIVE CRAP ANSWERSが述べたように、 はread単なるキーと値のルックアップですが、しばらく探索した後、同じように機能しますが、主キーの代わりにインデックスを使用する関数index_readとも見つかりました。index_write

4

1 に答える 1

7

記憶からですが、一度に1つずつ:

  • readでは、常にキー ルックアップが使用されますkeypos。これは基本的にキーと値のルックアップです。
  • match_objectキーでselect可能であれば、クエリを最適化しますkeypos。つまり、そのキーのみを最適化に使用します。それ以上のインデックス タイプを使用することはありません。
  • qlcクエリコンパイラがあり、可能であれば追加のインデックスを使用しようとしますが、それはすべてクエリプランナーとそれがトリガーされるかどうかに依存します。erl -man qlc詳細があり、計画を出力するように依頼できます。

Mnesia テーブルは、基本的に用語から用語へのキーと値のマップです。通常、これは、キー部分がクエリがラッチして使用できるものである場合、それが使用されることを意味します。それ以外の場合は、テーブル全体のスキャンが表示されます。これにはコストがかかる場合がありますが、スキャンはメモリ内で行われるため、通常はかなり高速であることに注意してください。

また、テーブル タイプに注意してください:setはハッシュ テーブルであり、部分的なキー マッチを利用できません。ordered_setはツリーであり、部分一致を実行できます。

例 - key がある場合、辞書式の順序付けによりツリーを利用して高速なウォークができるため、キーとしての{Id, Timestamp}クエリかなり高速です。これは、従来の RDBMS で複合 INDEX/PRIMARY KEY を指定するのと同じです。{Id, '_'}ordered_set

インデックスを追加せずに単純なクエリを実行できるようにデータを配置できる場合は、その表現が優先されます。また、追加のインデックスはバッグとして実装されるため、インデックスに多くの一致がある場合、非常に非効率的であることに注意してください。言い換えれば、タプル内の異なる値がほとんどない位置にインデックスを付けるべきではないということです。たとえば、ユーザー列の電子メール アドレスなど、さまざまな (ほとんどの場合) 異なる値を持つものにインデックスを付ける方が適切です。

于 2013-09-29T21:10:13.580 に答える