2009-07-21 11 views
4

私はこのレコードのための記憶媒体テーブルを持っています。erlang - タプルの内容をqlcとmnesiaとどのように一致させることができますか?

-record(peer, { 
    peer_key, %% key is the tuple {FileId, PeerId} 
    last_seen, 
    last_event, 
    uploaded = 0, 
    downloaded = 0, 
    left = 0, 
    ip_port, 
    key 
}). 

Peer_keyは今、特定のファイルIDを持つすべてのピアからip_portフィールドを抽出する必要があり、タプル{FILEID、ClientIdを}です。

私は実行可能な解決策を考え出したが、これは良い方法であるかどうかはわからない:

qlc:q([IpPort || #peer{peer_key={FileId,_}, ip_port=IpPort} <- mnesia:table(peer), FileId=:=RequiredFileId]) 

感謝。

答えて

3

{FileId、PeerId}のようなタプルプライマリキーを持つordered_setテーブル型を使用し、{RequiredFileId、_}のようなタプルのプレフィックスの一部をバインドすると、そのプレフィックスを持つキーの範囲が完全なテーブルスキャンではなく、検査されます。 qlc:info/1を使用してクエリプランを調べ、発生している選択がキープレフィックスをバインドしていることを確認できます。

0

クエリの時間は、すべての行をスキャンする必要があるため、テーブルのサイズに比例して増加します。したがって、現実的なテーブルデータでそれをベンチマークして、実際に実行可能かどうかを確認してください。

高速化が必要な場合は、ファイルIDを持つすべてのピアをすばやく見つけることができるようにする必要があります。これは、[fileid、peerid]を属性として持つbag-typeのテーブルを使用して行うことができます。ファイルIDを指定すると、すべてのピアIDを取得できます。これで、ピアテーブルキーを構築して検索することができます。

もちろん、ピアテーブルを変更するすべてのトランザクション内にそのバッグタイプのテーブルを維持する必要があります。

もう1つのオプションは、fileidを繰り返して、その列にmnesiaインデックスを追加することです。私はそれだけでは、俗人自身の副次的なインデックスにはありません。

関連する問題