[英]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 ;
问题是桌子变得非常大。 许多千兆字节的数据(我们有一个爬行引擎)。
我们每天都在向表中插入数据,但很少检索数据。 现在,随着桌子变得越来越大,处理桌子变得越来越困难。
我们讨论了两种可能性
我希望我已经清楚地解释了这个问题。 我需要知道的是,从长远来看,以上两者中哪一个是更好的解决方案。 什么是副词。 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.