MySQL的“分区”与将数据拆分到不同表中有什么区别?

5
我们有一张名为“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提供的解决方案,而第二种情况似乎需要自己搭建。我的理解正确吗? - Ozair Kafray
Ozair Kafray - 有些差异,我知道其中一些。例如,当您使用分区时,查询表的方式与以前相同,对最终用户而言仍然是一个表,尽管它被分成多个文件。至于另一种解决方案,如果您需要查询数据,则需要首先通过连接、临时表或类似方法将所有表一起返回。对于任何功能,您永远不会知道......Darhazer发布的链接很有趣。 - Imran Omar Bukhsh
4个回答

4
区别在于在第一种情况下,您让MySQL进行分片,在第二种情况下,您自己进行分片。MySQL不会扫描不包含数据的任何分片,但是如果您有一个查询WHERE forum_id IN(...),它可能需要扫描几个分片。据我记得,在这种情况下,操作是同步的,例如MySQL一次查询一个分区,您可能希望将其异步实现。通常,如果您自己进行分区,您会更加灵活,但对于基于forum_id的简单分区,如果您一次只查询1个forum_id,则MySQL分区可以使用。
我的建议是阅读MySQL关于分区的文档,特别是限制和限制部分,然后再做决定。

这可能是一个愚蠢的问题。我读到mysql分区不支持外键。这是否意味着我不能基于上表中的forum_id进行分区?如果不是,那么我如何基于forum_id进行分区?我无法理解关键字、哈希等。此外,文档说您不能在子分区中使用范围。这是否意味着我将无法对数据进行子分区?或者我可以使用哈希在post_id上进行子分区吗? - Imran Omar Bukhsh
文档说明了你不能使用外键约束。这是因为MySQL需要搜索每个分区以查找匹配的值,以确保该值存在。如果您自己对表进行分区,则无法使用外键引用分区表,但可以在表本身中使用外键。但在分片应用程序和NoSQL中,一致性大多由应用程序而不是数据库服务器管理。 - Maxim Krizhanovsky
“FOREIGN KEYs” 不是必需的。只需确保有适当的索引来替代它们即可。 - Rick James

1
尽管这是一篇旧文章,但如果您的引擎仍然是 MyISAM,请注意关于分区的警告。MySQL 8.0 不再支持除 Innodb 或 NDB 存储引擎之外的分区。在这种情况下,您必须将您的 MyISAM 表格转换为 InnoDB 或 NDB,但在转换之前需要先删除分区,否则之后无法使用。

0

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

"Sharding"是将数据分散在多个服务器上。请参见MariaDB和Spider。这样可以实现大小增长和可能的性能扩展。如果最终需要分片,则forum_id可能是最佳选择。但这假定没有任何论坛太大而无法放在一个服务器上。

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

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


0

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

基本上,让你的系统不断发展,同时熟悉分区技术,当你的系统真正需要被“切割成片段”时,使用分区来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接