2016-03-29 9 views
2

Ich habe RethinkDB in letzter Zeit gestoßen, und war sehr ängstlich zu sehen, verbindet Dokumentation Abschnitt. Von dem, was ich weiß, speichert RethinkDB Daten in Shards, die verteilt werden können (und das ist afaik praktisch eine riesige NO für Joins). Wie führt RethinkDB Join-Abfragen durch? Lädt es im Grunde alle Daten auf einem Knoten herunter (was bestehende Indizes nutzlos machen würde, oder?), Oder verwendet es einen komplizierteren Algorithmus?Wie RethinkDB-Joins implementiert sind?

Antwort

4

In RethinkDB 2.2 und davor führt eine eqJoin einen Index getAll Operation auf der rechten Tabelle für jedes Dokument in der linken Eingabe. Dieser Vorgang wird für jeden Shard gestartet, der den linken Eingang des Befehls eqJoin hostet. Wie Sie darauf hingewiesen haben, müssen Sie bei der Ausführung der getAll möglicherweise das Netzwerk durchlaufen, um einen Shard der rechten Tabelle auf einem anderen Server zu erreichen. Indizes werden jedoch weiterhin verwendet.

(Sie die Implementierung von eqJoin finden Sie hier: https://github.com/rethinkdb/rethinkdb/blob/v2.2.x/src/rdb_protocol/terms/rewrites.cc#L121 Es ist nur ein Umschreiben auf andere Operationen)

Beginnend mit dem kommenden RethinkDB 2.3, batched eqJoin Anwendungen getAll Operationen. Dies bedeutet, dass es eine Reihe von Ergebnissen (z. B. bis zu 1 MB) von der linken Eingabe liest und dann eine einzelne getAll an die Shards der rechten Tabelle ausgibt. Sobald es die Daten von diesen Shards zurückbekommt, kombiniert es es mit den Daten, die es zuvor von der linken Eingabe gelesen hatte, und leitet sie an den Benutzer weiter. Dann wiederholt es dies, bis alle Daten von der linken Eingabe verarbeitet worden sind. Dieser Ansatz erfordert wesentlich weniger Netzwerk-Roundtrips zwischen den Servern und ist in der Regel deutlich schneller. Sie können weitere Details über die neue Implementierung unter https://github.com/rethinkdb/rethinkdb/issues/5115 finden.

Schließlich sind die anderen verfügbaren Join-Operationen (innerJoin und outerJoin) nicht indiziert und sollten nicht für Datensätze beliebiger signifikanter Größe verwendet werden, wie die Dokumentation ebenfalls zeigt.