分片的性能影响是什么?

时间:2012-08-28 10:07:14

标签: database performance join sharding

我是分片新手,想知道分片对各种查询有什么影响。对于名为“people”的示例数据集:

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能够执行分片选择然后其他节点不需要继续执行任何进一步的指令,这个假设是否正确?

对于分片和复杂的连接是否有任何已知的性能影响(超出这个简单示例)?

3 个答案:

答案 0 :(得分:2)

确实可以并行完成。

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

但是,如果您有多对一的话ordersorders表中与people表中相关行相同的分片中的所有行进行分片,然后不会发生此分片问题。

你需要设计你的分片方法,这样你就会得到很多像这样的情况,很少(理想情况下没有)你最终会穿过碎片。

您还希望将碎片放在您实际寻求的密钥上。例如。如果您通过用户名查找人员作为其他所有内容的起点,那么您希望按用户名而不是ID进行分片,因为当您找到它们时,您已经知道要查找哪个单个分片,而不是仅仅为了从大多数人那里得到零行。

答案 1 :(得分:1)

是的,分片会带来严重的性能变化。它从不允许应用程序保持不变。

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

使用跨分区交互进行分片时,这会变得非常讨厌。编写针对所有分片运行的查询的分区数量成本是线性的。这意味着您可以通过添加节点获得零加速。

答案 2 :(得分:0)

免责声明:我为ScaleBase工作,这是一个完整的横向扩展解决方案的制造商和“自动分片机”,如果你喜欢,外观和感觉就像1个MySQL,代理一个“分片”网格,自动化命令路由和并行化跨数据库查询,并合并结果 - 您不会看到与来自1 DB的结果的差异。 ORDER,GROUP,LIMIT,支持agg功能!根据命令和参数在“控制器”内完成路由和并行化。

根据我们客户的经验,我们不仅通过并行查询获得了出色的性能改进,还改进了维护,考虑创建索引,向表中添加列 - 这些也是并行化的,运行速度更快。所有代码都没有或几乎没有变化。

您的查询示例是“all-db”执行的经典示例,如果分布式和并行化,它们肯定会运行得更快。索引更高效,使用RAM等...

希望我帮助过。