我是分片的新手,想知道分片对各种查询有什么影响。对于名为“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”列中的“people”,并且想要执行连接...
SELECT order_id,
order_amount,
order_date,
person_fname,
person_lname
FROM orders
LEFT JOIN people
WHERE order_amount > 50
实际上所有节点都将并行运行查询吗?我假设每台服务器在每个步骤中要做的工作更少,而不是一个实例同时运行八个记录的查询,四个实例将同时运行两个(ish)记录的查询,进一步的好处是如果 DBMS能够执行分片选择然后其他节点不需要继续执行任何进一步的指令,这个假设是否正确?
分片和复杂连接是否有任何已知的性能影响(除了这个简单示例之外)?
最佳答案
它确实允许并行完成。
如果连接必须跨越不同的分片,它确实会使连接变得复杂,因此速度变慢。
但是,对于多对一,如果您有例如orders
以这样的方式分片,即 orders
表中的所有行都与 people
表中的相关行在同一个分片中,然后这个不会发生跨分片问题。
您需要设计您的分片方法,以便您会遇到很多这样的情况,并且很少(最好没有)最终交叉分片。
您还希望将分片放在您实际最常寻找的键上。例如。如果您通过用户名找到人作为其他一切的起点,那么您希望通过用户名而不是 id 进行分片,因为当找到他们时您已经知道要击中哪个分片,而不是必须击中所有的人只是为了从大多数返回零行。
关于database - 分片对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157026/