2011-06-27 36 views
2

我们有一个名为posts_content的mysql表。Mysql'分区'vs将数据分割成不同的表

的结构如下:

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_ids所以就约50分区的分区表。需要注意的是,即使做出这样最终会成长每个分区再次数据的多千兆字节甚至最终需要自己的驱动
  2. 创建每个forum_id单独的表和分裂这样的数据。

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

感谢你

+0

我得到了问题,但你提出的解决方案,看起来与我一样,除了在一个MySQL提供的解决方案和情况2似乎你会建立自己的。我说得对吗? –

+0

Ozair Kafray - 有些差异,有些我知道。例如,当您使用分区时,您以与以前相同的方式查询表,但对于最终用户而言,它仍然是一个表,尽管它分为许多文件。作为另一种解决方案,如果您需要查询数据,您需要首先将所有表放回到连接或临时表中或类似的东西中。有了你永远不知道的任何功能...... Darhazer发布的链接很有趣 –

回答

3

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

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

+0

好吧,这可能是一个愚蠢的。我读过mysql分区不支持外键。这是否意味着我无法根据上表中的forum_id进行分区?如果没有,那么我如何根据forum_id进行分区?我无法理解关键字,散列等。另外文档说,你不能在子分区中使用范围。这是否意味着我将无法再分配我的数据?或者我可以使用散列post_id subpartition? –

+0

该文档说明您不能使用外键约束。这是因为MySQL需要搜索每个分区的匹配值,以确保该值存在。如果您自己对表进行分区,那么您将无法使用外键,也会引用分区表,但可以在表中使用外键。但是在分片应用程序和一般的NoSQL中,一致性主要由应用程序管理,而不是由数据库服务器管理。 –

+0

'FOREIGN KEY''不是必需的。只要确保有合适的索引来替代它们即可。 –

0

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

“分片”是将数据分离到多个服务器上。见MariaDB和Spider。这允许尺寸增长和可能的性能缩放。如果最终分片,forum_id可能是最好的。但是,这假定没有论坛太大,不适合一台服务器。

“分区”分割数据,但只在一台服务器中分割;它似乎没有为您的用例带来任何好处。由forum_id分区将不会提供任何性能。

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