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