这些天我正在阅读有关管理 MySQL 数据库中庞大数据集的不同方法。
老实说,此刻,我很困惑。我阅读了有关上述问题的一些概念,但我不知道它们之间有何关联?
请看看这些:
- Partitioning - 这是一个插件
- 集群 - 我猜命名为 NDB
- 分片 - 我认为这是一个概念,没有任何可实现的
场景是在 MySQL 中存储/维护/搜索大量数据(假设一个表有 50 亿行)。所以我们必须拆开数据集,但是如何拆开呢?
我有几个问题:
- 以上三项之间有多少重叠?
- 在分区时,所有部分将存储在同一台机器(服务器)上?或者它们可以保存在不同的机器中?
- 如何检测数据存储在哪个分区? (以便相应地查找数据)
- 我知道分区是针对“表”的,集群是针对“数据库”的吗?
- 通过分片,我们将数据复制到不同的服务器中,或者我们会在不同的服务器中拥有不同的数据?还有,是发生在“表”层还是“数据库”层?
- 不同部分(集群/分区)在需要时如何相互查看?就像我们需要在整个表上有一个
join
子句一样。假设数据分布在不同的分区/机器中。
- 要使用集群,我需要安装不同版本的 MySQL 吗?普通版不支持吗?
无论如何,我已经阅读了超过 3 天的内容,但主要概念对我来说仍然模棱两可。
快速比较:
分片是在多个服务器之间分配数据。
- 以上三项之间有多少重叠?
答:很少。每个人都以不同的方式为不同的目标分配数据。
- 在分区时,所有部分将存储在同一台机器(服务器)上?或者它们可以保存在不同的机器中?
A:在分区时,所有部分都会存储在同一台机器(服务器)的同一个实例上。
- 如何检测数据存储在哪个分区?
答:如果可行,请提供 WHERE
查明需要哪些分区的子句。 (参见“分区修剪”)
- 我知道分区是针对“表”的,集群是针对“数据库”的吗?
A:我想你可以这样描述。集群(也)具有在不同硬件上拥有第二个副本的优势。
- 通过分片,我们将数据复制到不同的服务器中,或者我们会在不同的服务器中拥有不同的数据?还有,是发生在“表”层还是“数据库”层?
答:不。通常最大的表以某种任意方式拆分——一些行放在每个分片上。然后客户端必须知道如何进行拆分才能知道要与哪个服务器通信。 (这个重要任务没有固定代码。)较小的表要么复制到所有分片上,要么放到其他机器上。
- 不同部分(集群/分区)在需要时如何相互查看?就像我们需要在整个表上有一个连接子句一样。假设数据分布在不同的分区/机器中。
A: A JOIN
仅在一台服务器上工作。 (MariaDB 有“FEDERATEDX”,但这是一个代价高昂的解决方法。)对于分区,查询将许多分区视为一个大表,因此 JOIN
不是问题。对于集群,一切都在每台服务器上,没问题。因为分片很好,在您只有大表的一部分的约束下。
顺便说一句:读这个:How to handle a question that asks many things