database - 分片对性能有何影响?

标签 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”列中的“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/

相关文章:

sql - 使用 PostgreSQL 查找重复行

database - 尝试设计一个列,该列应该对另一个表的值求和

c# - 最快同步

mysql - Concat/内连接 MySQL

django - 加入来自不同基本模型 Django 的多个查询集

java - 每个 http 请求的直接数据库连接与连接池 - 有什么区别

mysql - 下线构建器应用程序的 SQL 和数据库设置

python - 如何使用 python 在循环中有效地调用函数?

mysql - Mysql中简单查询速度慢

mysql - 使用 student_id 显示学生出勤情况的单一查询