mysql - 如何处理庞大的数据集

标签 mysql sql performance

<分区>

这些天我正在阅读有关管理 MySQL 数据库中庞大数据集的不同方法。

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

请看看这些:

  • Partitioning - 这是一个插件
  • 集群 - 我猜命名为 NDB
  • 分片 - 我认为这是一个概念,没有任何可实现的

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

我有几个问题:

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

无论如何,我已经阅读了超过 3 天的内容,但主要概念对我来说仍然模棱两可。

最佳答案

快速比较:

<表类="s-表"> <头> 描述 服务器数量 多余? 一个目标 <正文> paritioning 1 没有 时间序列 clustering >= 3 是 恢复 sharding >1 没有 写入缩放

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

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

答:很少。每个人都以不同的方式为不同的目标分配数据。

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

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

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

答:如果可行,请提供 WHERE查明需要哪些分区的子句。 (参见“分区修剪”)

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

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

  1. 通过分片,我们将数据复制到不同的服务器中,或者我们会在不同的服务器中拥有不同的数据?还有,是发生在“表”层还是“数据库”层?

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

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

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

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

关于mysql - 如何处理庞大的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66929850/

相关文章:

MySQL 多维从 View 中选择

mysql - 外键约束不当

sql - 查询未按预期工作

mysql - 如何从 SELECT 查询返回的一组值中获取最小值?

MySQL 多列与单列的速度/优化

mysql - 从今天开始按顺序从数据库中提取事件

sql - 如果表存在则执行 select 语句

c# - 仅当使用 System.Data.OracleClient 时,函数才保持 INVALID,通过 SQL Developer 工作

performance - Haskell:Data.Text 与 Data.Text.Lazy 性能对比

android - Android中如何处理非常非常大的数据?