最近我一直在窥探RethinkDB,并且非常害怕看到joins文档部分。据我所知,RethinkDB将数据存储在碎片中,这些碎片可能是分布式的(这实际上是一个用于联接的巨大的NO )。那么RethinkDB如何执行连接查询呢?它基本上是下载一个节点上的所有数据(这会使现有的索引毫无用处,不是吗?),还是使用更复杂的算法?
发布于 2016-03-31 18:46:00
在RethinkDB 2.2和之前,eqJoin对左侧输入中的每个文档在右表上执行索引getAll操作。此操作是在承载eqJoin命令左侧输入的每个碎片上启动的。正如您所指出的,执行getAll可能需要经过网络才能到达另一台服务器上的右表碎片。但是,仍在使用索引。
(您可以在这里找到eqJoin的实现:protocol/terms/rewrites.cc#L121 --它只是对其他操作的重写)
从即将发布的RethinkDB 2.3开始,eqJoin使用批处理getAll操作。这意味着它从左侧输入读取一组结果(例如,最多1MB),然后向右侧表的碎片发出一个getAll。一旦从这些碎片中获取数据,就会将其与先前从左侧输入读取的数据组合起来,并将其传递给用户。然后,它会重复这一点,直到左输入的所有数据都被处理了。这种方法需要大大减少服务器之间的网络往返,而且通常要快得多。您可以在https://github.com/rethinkdb/rethinkdb/issues/5115上找到有关新实现的更多细节。
最后,其他可用的连接操作(innerJoin和outerJoin)没有索引,不应该用于任何重要大小的数据集,正如文档还指出的那样。
https://stackoverflow.com/questions/36296890
复制相似问题