如何处理庞大的数据集

时间:2021-04-03 10:02:11

标签: mysql sql performance

最近,我正在阅读有关管理 MySQL 数据库中庞大数据集的不同方法。

说实话,此刻我很困惑。我阅读了有关上述问题的一些概念,但我不知道它们之间有何关联?

请看看这些:

  • 分区 - 这是一个插件
  • 聚类 - 我猜命名为 NDB
  • 分片 - 我认为这是一个概念,没有什么可实施的

该场景是在 MySQL 中存储/维护/搜索大量数据(假设有 50 亿行的表)。所以我们必须拆分数据集,但如何拆分?

我有几个问题:

  1. 以上三项之间有多少重叠?
  2. 在分区中,所有部件都将存储在同一台机器(服务器)上?或者它们可以保存在不同的机器中?
  3. 如何检测数据存储在哪个分区? (为了相应地查找数据)
  4. 我知道分区是针对“表”的,集群是针对“数据库”的吗?
  5. 通过分片,我们是在不同的服务器上复制数据,还是在不同的服务器上有不同的数据?另外,是发生在“表”层还是“数据库”层?
  6. 不同的部分(集群/分区)在需要时如何相互看到?就像我们需要在整个表上有一个 join 子句。假设数据分布在不同的分区/机器中。
  7. 要使用集群,是否需要安装不同版本的 MySQL?普通版不支持吗?

无论如何,我已经阅读了超过 3 天的内容,主要概念对我来说仍然不明确。

1 个答案:

答案 0 :(得分:1)

快速比较:

<头>
描述 服务器数量 冗余? 一个目标
paritioning 1 没有 时间序列
clustering >= 3 恢复
sharding >1 没有 写入缩放

分片是在多个服务器之间分配数据。

  1. 以上三项之间有多少重叠?

A:很少。每个人为了不同的目标以不同的方式划分数据。

  1. 在分区中,所有部件都将存储在同一台机器(服务器)上?或者它们可以保存在不同的机器中?

A:在分区中,所有部分将存储在同一台机器(服务器)上的同一个实例上。

  1. 如何检测数据存储在哪个分区?

A:在可行的情况下,提供一个 WHERE 子句来指明需要哪些分区。 (参见“分区修剪”)

  1. 我知道分区是针对“表”的,集群是针对“数据库”的吗?

A:我想你可以这样描述。集群(也)具有在不同硬件上拥有第二个副本的优势。

  1. 通过分片,我们是在不同的服务器上复制数据,还是在不同的服务器上有不同的数据?另外,是发生在“表”层还是“数据库”层?

A:不可以。通常最大的表以某种任意方式拆分——有些行放在每个分片上。然后客户端必须知道如何进行拆分才能知道要与哪个服务器通信。 (这项重要任务没有固定代码。)较小的表要么复制到所有分片上,要么放在其他机器上。

  1. 不同的部分(集群/分区)在需要时如何相互看到?就像我们需要在整个表上有一个连接子句一样。假设数据分布在不同的分区/机器中。

A:JOIN 只在一台服务器上工作。 (MariaDB 有“FEDERATEDX”,但这是一种代价高昂的解决方法。)对于分区,查询将许多分区视为一个大表,因此 JOIN 不是问题。对于集群,一切都在每台服务器上,没问题。因为分片很好在你只有大表的一部分的约束下

顺便说一句:请阅读:How to handle a question that asks many things

相关问题