2012-08-28 109 views
3

我是分手新手,想知道分片对各种查询有什么影响。对于命名为“人”的样本数据集:分片的性能影响是什么?

person_id | person_fname | person_lname | person_dob 
---------------------------------------------------- 
1   | John   | Smith  | 1972-03-04 
2   | Sally  | Jones  | 1968-09-14 
3   | Phil   | Forrester | 1976-11-25 
4   | Gwen   | Langley  | 1955-04-20 
5   | Pedro  | Romero  | 1962-12-21 
6   | Gene   | Halford  | 1978-01-11 
7   | Juan   | Peza   | 1977-08-07 
8   | Pierre  | Henry  | 1980-04-30 

的数据是分片同样在四个节点通过创建代理身份“ID”的哈希值。但是,你需要对潜在的跨越所有的节点,如记录执行读写操作:

SELECT person_fname, 
     person_lname 
FROM people 
WHERE person_dob > '1970-01-01' 

或者说你有“订单”的另一种表,它引用“人”对“为person_id”列,并希望执行加入...

SELECT order_id, 
      order_amount, 
      order_date, 
      person_fname, 
      person_lname 
FROM  orders 
LEFT JOIN people 
WHERE  order_amount > 50 

实际上,所有节点都会并行运行查询吗?我假设每个服务器对每个步骤所做的工作较少,而不是一个实例在八条记录上运行查询,同时,四个实例将通过两条(ish)记录运行查询,而且如果DBMS能够执行碎片选择,然后其他节点不需要继续执行任何进一步的指令,这个假设是否正确?

是否有任何已知的性能影响与分片和复杂的联接(除了这个简单的例子)?

回答

2

它确实会允许并行完成。

如果它们必须跨越不同的碎片,它确实可以使连接变得复杂,因此速度更慢。

但是,如果你有多对一的话, orders以这样的方式分片,即orders表中的所有行与people表中的相关行相同的分片中,则不会发生这种交叉分片问题。

您需要设计分片方法,以便获得许多像这样的案例和很少的案例(理想情况下没有)您最终交叉碎片的地方。

你也希望在你最想找的钥匙上找到你的碎片。例如。如果你通过用户名找到人作为其他任何事物的起点,那么你希望通过用户名而不是id来分割,因为当找到它们时,你已经知道哪个单独的分片会被击中,而不是仅仅击中所有分支从大多数中取回零行。

+0

谢谢,这是有道理的 –

+0

可悲的是,上述属于“容易说什么”的类别。 –

1

是的,分片引入了严重的性能变化。它从不允许应用程序保持不变。

最合理的分片方法是数据模型允许将数据分区为真正独立。就像在租户根本不互动的多租户情况下一样。在这种情况下,连接从不跨越分区,一切都很好。

当与交叉分区交互分片时,这会非常非常讨厌。编写针对所有分片运行的查询在分区数量方面的成本是线性的。这意味着您可以通过添加节点来实现零加速。

+0

对不起,我没有完全遵循,“它永远不会让应用程序保持不变”,这是什么意思? –

+2

当您决定对应用程序进行分片时,性能特征通常会发生变化,因此应用程序通常不得不在许多地方进行修改。 – usr

+0

对啊,所以如果你决定从未硬化的角度来分割,你很可能不得不改变你的应用程序的工作方式以避免陷阱?是否能够跨多个节点并行查询获得性能优势,还是典型的工作负载增加的复杂性否定了这一点? –

0

免责声明:我为ScaleBase工作,如果您喜欢,可以使用完整的横向扩展解决方案的制造商,看上去和感觉像是1 MySQL,代理一个“碎片”网格,自动执行命令路由和并行化交叉数据库查询以及合并结果 - 您不会看到来自1个数据库的结果的差异。 ORDER,GROUP,LIMIT,支持agg函数!路由和并行化是根据命令和参数在“控制器”内完成的。

从与客户的经验来看,我们不仅在并行查询方面取得了巨大的性能提升,还改进了维护,考虑创建索引,向表中添加列 - 这些列也是并行化的,运行速度更快。所有这些代码都没有或者很小的变化。

查询示例是“全部数据库”执行的经典示例,如果分布式和并行化,它们的运行速度肯定会更快。索引更有效率,内存使用等等...

希望我帮了忙。

+0

谢谢Doron,它如何与MySQL Cluster自动分片设置相比较? –

相关问题