如何实现RethinkDB加入?

时间:2016-03-29 23:23:47

标签: rethinkdb nosql

我最近一直在调查RethinkDB,并且非常害怕看到加入文档部分。据我所知,RethinkDB将数据存储在分片中,这些分片可能是分布式的(并且实际上是一个巨大的 NO 用于连接)。那么RethinkDB如何执行连接查询?它基本上是在一个节点上下载所有数据(这会使现有索引无效,不会吗?),还是使用更复杂的算法?

1 个答案:

答案 0 :(得分: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找到有关新实施的更多详细信息。

最后,其他可用的联接操作(innerJoinouterJoin)没有编入索引,也不应该用于任何大小的数据集,正如文档中所指出的那样。