【问题标题】:Mysql 'Partitioning' vs Splitting data into different tablesMysql“分区”与将数据拆分到不同的表中
【发布时间】:2011-06-27 10:54:40
【问题描述】:

我们有一个名为 posts_content 的 mysql 表。

结构如下:

CREATE TABLE IF NOT EXISTS `posts_content` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL,
  `forum_id` int(11) NOT NULL,
  `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=79850 ;

问题是桌子变得非常大。许多千兆字节的数据(我们有一个爬行引擎)。

我们每天都在向表中插入数据,但我们很少检索数据。现在随着桌子变得越来越大,处理桌子变得越来越困难。

我们讨论了两种可能性

  1. 使用 MySQL 的分区功能,使用 forum_id 对表进行分区(大约有 50 个 forum_id,因此大约有 50 个分区。请注意,即使每个分区都这样做,最终也会再次增长到许多千兆字节的数据,甚至最终需要自己的驱动器
  2. 为每个 forum_id 创建单独的表并像这样拆分数据。

我希望我已经清楚地解释了这个问题。我需要知道的是,从长远来看,以上两者中的哪一个会是更好的解决方案。什么是副词。不赞成两种情况。

谢谢你

【问题讨论】:

  • 我收到了这个问题,但是您提出的解决方案在我看来是一样的,只是其中一个 MySQL 提供了解决方案,而在情况 2 中,您似乎将构建自己的解决方案。我做对了吗?
  • Ozair Kafray - 有一些差异,我知道一些。例如,当您使用分区时,您以与以前相同的方式查询表,对于最终用户来说,它仍然是一个表,尽管它被分成许多文件。作为另一种方式的解决方案,如果您需要查询数据,您需要首先通过连接或临时表或类似的东西将所有表恢复到一起。拥有你永远不知道的任何功能……Darhazer 发布的链接很有趣

标签: mysql scalability partitioning


【解决方案1】:

不同之处在于,在第一种情况下,您让 MySQL 进行分片,而在第二种情况下,您需要自己进行。 MySQL 不会扫描任何不包含数据的分片,但是如果您有查询 WHERE forum_id IN(...) 它可能需要扫描多个分片。据我记得,在这种情况下,操作是同步的,例如MySQL 一次查询一个分区,您可能希望异步实现它。一般来说,如果你自己做分区,你会更灵活,但是对于简单的分区,基于forum_id,如果你一次只查询1个forum_id,MySQL分区是可以的。

我的建议是阅读有关分区的 MySQL 文档,尤其是 restrictions and limitations 部分,然后再决定。

【讨论】:

  • 好吧,这可能是一个愚蠢的。我读到 mysql 分区不支持外键。这是否意味着我不能根据上表中的 forum_id 进行分区?如果没有,那么如何根据 forum_id 进行分区?我无法理解密钥、哈希等。文档还说您不能将范围与子分区一起使用。这是否意味着我将无法对我的数据进行子分区?或者我可以使用哈希对 post_id 进行子分区吗?
  • 文档说你不能使用外键约束。这是因为 MySQL 需要在每个分区中搜索匹配值,以确保该值存在。如果您自己对表进行分区,您将无法使用外键,也不能引用分区表,但可以在表本身中使用外键。但在分片应用程序中,以及一般的 NoSQL 中,一致性主要由应用程序管理,而不是由数据库服务器管理。
  • FOREIGN KEYs 不是必需的。只要确保有合适的索引来替换它们。
【解决方案2】:

这里有一个很好的答案:https://dba.stackexchange.com/a/24705/15243

基本上,让您的系统增长,在您熟悉分区的同时,当您的系统确实需要“裁剪”时,请使用分区。

【讨论】:

    【解决方案3】:

    3 倍空间收缩(并且可能是加速)的快速解决方案是压缩 content 并将其放入 MEDIUMBLOB。在客户端而不是服务器中进行压缩;这节省了带宽,并允许您在您拥有(或将拥有)的许多客户端服务器之间分配计算。

    “分片”是在多个服务器之间分离数据。请参阅 MariaDB 和 Spider。这允许大小增长和可能的性能扩展。如果你最终分片,forum_id 可能是最好的。但这假设没有论坛太大而无法在一台服务器上容纳。

    “分区”拆分数据,但仅限于单个服务器内;您的用例似乎没有任何优势。按 forum_id 进行分区不会提供任何性能。

    删除FOREIGN KEYs;改为调试您的应用程序。

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 2011-03-03
      • 2023-03-07
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多