数据库分片与分区

Ami*_*rma 127 mysql sharding database-partitioning

我最近一直在阅读有关可扩展架构的文章.在这种情况下,继续显示wrt数据库的两个词是分片分区.我搜索了关于搜索引擎,维基百科和stackoverflow的描述,但最终仍然感到困惑.

stackoverflow的专家能帮助我掌握基础知识吗?

  • 分片分区有什么区别?
  • "所有分片数据库是否基本上都是分区的(在不同的节点上),但所有分区数据库都不一定是分片的"是真的吗?

Can*_*nis 93

分区更像是在表或数据库之间划分数据的通用术语.分片是一种特定类型的分区,即水平分区.

请参阅此处:http://www.quora.com/Whats-the-difference-between-sharding-and-partition

  • Sharding是*一种HP*.它不是惠普. (11认同)
  • 我是否认为水平分区只是意味着将表中的行拆分为多个子表(可能在同一模式或数据库实例中)。而分片是水平分区,将子表放入单个数据库中的单独模式中,或进入不同机器上的不同数据库实例。或不? (2认同)

NoC*_*nce 36

看起来这样可以回答您的问题:

水平分区按行拆分一个或多个表,通常在模式和数据库服务器的单个实例中.它可以通过减少索引大小(以及搜索工作量)提供优势,前提是有一些明显的,健壮的,隐式的方法来识别将在哪个表中找到特定行,而不需要首先搜索索引,例如经典'CustomersEast'和'CustomersWest'表的示例,其中的邮政编码已经指明了它们的位置.

分片超出了这个范围:它以相同的方式对有问题的表进行分区,但是它可以在可能的多个模式实例中进行分区.显而易见的优点是,现在可以跨多个服务器(逻辑或物理)分割大型分区表的搜索负载,而不仅仅是同一逻辑服务器上的多个索引.

资料来源:Wiki-Shard.

分片是在多台机器上存储数据记录的过程,也是MongoDB满足数据增长需求的方法.随着数据大小的增加,单个机器可能不足以存储数据,也不足以提供可接受的读写吞吐量.分片解决了水平缩放的问题.通过分片,您可以添加更多机器来支持数据增长以及读写操作的需求.

资料来源:MongoDB.


Jea*_*ach 31

我也一直在深入研究这个问题,虽然我到目前为止已经提到了这个问题,但我收集的关键事实很少,并且我想分享这些事实:

分区是一个逻辑数据库或它的组成元件分成不同的部分独立的一个部门.由于负载平衡,数据库分区通常是出于可管理性,性能或可用性原因而完成的.

https://en.wikipedia.org/wiki/Partition_(database)

分片是一种分区,例如水平分区(HP)

还有垂直分区(VP),您可以将表拆分为较小的不同部分.规范化还涉及在表之间拆分列,但垂直分区超出了这一范围,即使已经规范化,也会对列进行分区.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

我非常喜欢Tony Baco对Quora的回答,他让你在模式(而不是列和行)方面思考.他说......

" 水平分区 "或分片正在复制[复制]模式,然后根据分片键分割数据.

" 垂直分区 "涉及划分模式(并且数据随之进行).

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partitioning-them

Oracle的数据库分区指南有一些很好的数字.我从文章中复制了一些摘录.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

何时分区表

以下是有关何时对表进行分区的一些建议:

  • 应始终将大于2 GB的表视为分区的候选对象.
  • 包含历史数据的表,其中新数据被添加到最新分区中.一个典型的例子是历史表,其中只有当前月份的数据是可更新的,而其他11个月是只读的.
  • 当表的内容需要分布在不同类型的存储设备上时.

分区修剪

分区修剪是使用分区提高性能的最简单也是最实质的方法.分区修剪通常可以将查询性能提高几个数量级.例如,假设一个应用程序包含一个包含订单历史记录的Orders表,并且该表已按周分区.请求单周订单的查询只能访问Orders表的单个分区.如果Orders表具有2年的历史数据,则此查询将访问一个分区而不是104个分区.由于分区修剪,此查询可能执行速度提高100倍.

分区策略

  • 范围
  • 哈希
  • 名单

您可以阅读他们的文本并可视化他们的图像,这些图像可以很好地解释

最后,重要的是要了解数据库是非常耗费资源的:

  • 中央处理器
  • 磁盘
  • I/O
  • 记忆

许多DBA将在同一台机器上进行分区,其中分区将共享所有资源,但通过拆分数据和/或索引来提供磁盘和I/O的改进.

而其他策略将采用"无共享"架构,其中分片将驻留在独立且不同的计算单元(节点)上,具有100%的CPU,磁盘,I/O和内存.提供自己的一系列优势和复杂性.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


小智 15

考虑数据库中具有 100 万行和 100 列的表在分区中,您可以将表划分为 2 个或更多具有如下属性的表:

  1. 40 万行(表 1),60 万行(表 2)

  2. 100 万行 60 列(表 1)和 100 万行 40 列(表 2)

    可能有多个这样的情况

这是一般分区

但是,拆分是指第一种情况下只有当我们将行的基础上的数据。如果我们将表分成多个表,我们需要维护多个相似的模式副本,因为现在我们有多个表。

  • 这真的很清楚,谢谢! (2认同)

小智 8

在谈论分区时,请不要使用术语复制或复制。复制是一个不同的概念,超出了本页的范围。当我们谈论分区时,更好的词是划分,而当我们谈论分片时,更好的词是分布。在分区中(通常和普遍理解并不总是),大数据集表的行被分成两个或多个不相交(不共享任何行)的组。您可以将每个组称为一个分区。这些组或所有分区仍然在一个 RDMB 实例的控制之下,这都是合乎逻辑的。每个组的基数可以是散列或范围等。如果表中有十年数据,那么您可以将每一年的数据存储在一个单独的分区中,这可以通过在一个分区的基础上设置分区边界来实现非空列 CREATE_DATE。查询数据库后,如果您指定介于 01-01-1999 和 31-12-2000 之间的创建日期,则只会命中两个分区,并且将是连续的。我在 DB 上做了类似的操作,记录了十亿多条记录,使用索引等所有 sql 时间从 30 秒缩短到 50 毫秒。分片是将每个分区托管在不同的节点/机器上。现在在分区/分片内搜索可以并行进行。


Pav*_*vel 5

拆分中的一个特例水平分区,当跨越多个数据库实例分区跨度。如果数据库是分片的,则意味着它根据定义进行了分区。