2009-07-21 7 views
4

Ich habe eine Mnesiatabelle für diesen Datensatz.erlang - Wie kann ich Tupelinhalte mit qlc und mnesia abgleichen?

-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 ist ein Tupel {FileId, ClientId}, jetzt muss ich das ip_port Feld von allen Peers extrahieren, die eine bestimmte FileId haben.

kam ich mit einer praktikable Lösung, aber ich bin mir nicht sicher, ob dies ein guter Ansatz ist:

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

Dank.

Antwort

3

Verwenden Sie den Tabellen-Typ "ordered_set" mit einem Tuple-Primärschlüssel wie {FileId, PeerId} und binden Sie dann teilweise ein Präfix des Tupels wie {RequiredFileId, _}, da nur der Bereich der Schlüssel mit diesem Präfix gültig ist geprüft, kein vollständiger Tabellenscan. Sie können qlc: info/1 verwenden, um den Abfrageplan zu überprüfen und sicherzustellen, dass alle vorkommenden Auswahlvorgänge das Schlüsselpräfix binden.

0

Die Abfragezeit wird linear mit der Tabellengröße anwachsen, da alle Zeilen gescannt werden müssen. Vergleichen Sie es mit realistischen Tabellendaten, um zu sehen, ob es wirklich funktioniert.

Wenn Sie es beschleunigen müssen, sollten Sie sich darauf konzentrieren, schnell alle Peers zu finden, die die Datei-ID tragen. Dies könnte mit einer Bag-Type-Tabelle mit [feilid, peerid] als Attribute erfolgen. Bei einer Datei-ID erhalten Sie alle Peers-IDs. Damit könnten Sie Ihre Peer-Tabellenschlüssel zum Nachschlagen erstellen.

Natürlich müssten Sie diese Tasche-Typ-Tabelle auch innerhalb jeder Transaktion, die die Peer-Tabelle ändern, pflegen.

Eine weitere Option wäre, fileid zu wiederholen und einen Mnesia-Index für diese Spalte hinzuzufügen. Ich bin einfach nicht in die eigenen sekundären Indizes von Mnesia.

Verwandte Themen