我是分片新手,想知道分片对各种查询有什么影响。对于名为“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能够执行分片选择然后其他节点不需要继续执行任何进一步的指令,这个假设是否正确?
对于分片和复杂的连接是否有任何已知的性能影响(超出这个简单示例)?
答案 0 :(得分:2)
确实可以并行完成。
如果必须跨越不同的分片,它确实可以使连接变得复杂,因此更慢。
但是,如果您有多对一的话orders
以orders
表中与people
表中相关行相同的分片中的所有行进行分片,然后不会发生此分片问题。
你需要设计你的分片方法,这样你就会得到很多像这样的情况,很少(理想情况下没有)你最终会穿过碎片。
您还希望将碎片放在您实际寻求的密钥上。例如。如果您通过用户名查找人员作为其他所有内容的起点,那么您希望按用户名而不是ID进行分片,因为当您找到它们时,您已经知道要查找哪个单个分片,而不是仅仅为了从大多数人那里得到零行。
答案 1 :(得分:1)
是的,分片会带来严重的性能变化。它从不允许应用程序保持不变。
最理智的分片方法是,数据模型是否允许将数据分区为真正独立的。就像在多租户情况下,租户根本不互动。在这种情况下,连接从不跨越分区,一切都很好。
使用跨分区交互进行分片时,这会变得非常讨厌。编写针对所有分片运行的查询的分区数量成本是线性的。这意味着您可以通过添加节点获得零加速。
答案 2 :(得分:0)
免责声明:我为ScaleBase工作,这是一个完整的横向扩展解决方案的制造商和“自动分片机”,如果你喜欢,外观和感觉就像1个MySQL,代理一个“分片”网格,自动化命令路由和并行化跨数据库查询,并合并结果 - 您不会看到与来自1 DB的结果的差异。 ORDER,GROUP,LIMIT,支持agg功能!根据命令和参数在“控制器”内完成路由和并行化。
根据我们客户的经验,我们不仅通过并行查询获得了出色的性能改进,还改进了维护,考虑创建索引,向表中添加列 - 这些也是并行化的,运行速度更快。所有代码都没有或几乎没有变化。
您的查询示例是“all-db”执行的经典示例,如果分布式和并行化,它们肯定会运行得更快。索引更高效,使用RAM等...
希望我帮助过。