繁体   English   中英

Mysql “分区”与将数据拆分到不同的表中

[英]Mysql 'Partitioning' vs Splitting data into different tables

我们有一个名为 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 创建单独的表并像这样拆分数据。

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

感谢您

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

我的建议是阅读关于分区的MySQL文档,特别是限制和限制部分,然后再决定。

在这里,您的问题很好: https//dba.stackexchange.com/a/24705/15243

基本上,让你的系统增长,同时你熟悉分区,当你的系统真的需要“裁剪成碎片”时,用分区来做。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM