2016-03-29 3 views
2

最近私はRethinkDBを掘り下げていましたが、ジョイントのドキュメントのセクションを見るのは非常に怖かったです。私が知っていることから、RethinkDBはデータを分散しているシャードに格納しています(実際には結合にはNO)。では、RethinkDBはどのように結合クエリを実行しますか?それは基本的に1つのノード上のすべてのデータをダウンロードしますか(それは既存のインデックスを役に立たなくするでしょうか?)、より複雑なアルゴリズムを使用していますか?RethinkDB結合はどのように実装されていますか?

答えて

4

RethinkDB 2.2以前では、eqJoinは、左側の入力にある各ドキュメントの右側のテーブルでインデックスgetAllを実行します。 この操作は、eqJoinコマンドの左手入力をホストしている各シャードで開始されます。 指摘したように、getAllを実行するには、別のサーバー上の右側のテーブルの断片に到達するためにネットワークを経由する必要があります。しかし、索引はまだ使用されています。

(あなたがここeqJoinの実装を見つけることができます:https://github.com/rethinkdb/rethinkdb/blob/v2.2.x/src/rdb_protocol/terms/rewrites.cc#L121それは他の操作にだけ書き換えます)今後のRethinkDB 2.3から

eqJoin用途はgetAll操作をバッチ処理しました。これは、左側の入力から一連の結果(最大1 MBなど)を読み取り、次に右のテーブルの断片に単一のgetAllを発行することを意味します。これらの破片からデータを戻すと、以前に左入力から読み取ったデータと結合してユーザーに渡します。次に、左入力からのすべてのデータが処理されるまでこれを繰り返します。 この方法では、サーバー間のネットワークラウンドトリップが大幅に少なくて済み、通常は大幅に高速化されます。新しい実装に関する詳細はhttps://github.com/rethinkdb/rethinkdb/issues/5115にあります。

最後に、その他の利用可能な結合操作(innerJoinおよびouterJoin)は索引付けされていないため、重要なサイズのデータ​​・セットには使用しないでください。

関連する問題