分区mySQL表

时间:2013-12-25 06:00:52

标签: mysql partitioning

我正在考虑对可能会变得非常大的mySQL表进行分区。现在的表就像这样

DROP TABLE IF EXISTS `uidlist`;
CREATE TABLE IF NOT EXISTS `uidlist` (
 `uid` varchar(9) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, 
 `chcs` varchar(16) NOT NULL DEFAULT '',
  UNIQUE KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii;

其中

  • uid是一个由小写字母
  • 开头的9个字符id字符串的序列
  • chcs是内部使用的校验和。

我怀疑分区这个表的最佳方法是基于uid字段的第一个字母。这会给出

Partition 1
abcd1234,acbd1234,adbc1234...

Partition 2
bacd1234,bcad1234,bdac1234...

然而,在我不知道如何去做之前,我从未做过分区。我概述的分区方案是否可行?如果是这样,我该如何实施呢?

我非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

查看手册以获取开始:)

http://dev.mysql.com/tech-resources/articles/partitioning.html

MySQL在分区和选择正确的策略时功能非常丰富取决于您的用例(分区可以帮助您进行顺序扫描吗?)以及数据增长的方式,因为您不希望任何单个分区变为太大而无法处理。

如果您的数据会随着时间的推移而逐渐增长,您可能需要执行基于创建日期的分区方案,以便(例如)在一年中生成的所有记录最终都在最后一个分区中,并且以前的分区永远不会被写入为了实现这一目标,您可能需要引入另一个列来规范这一点,请参阅http://dev.mysql.com/doc/refman/5.1/en/partitioning-hash.html

此方法的优化优势在于您可以在磁盘上拥有快速写入的最新分区(例如固态),并且可以将较旧的分区保存在具有良好读取速度的更便宜的磁盘上。 p>

无论如何,了解更多关于你的用例会帮助人们给你更具体的答案(可能包括sql代码)

编辑,也可以查看http://www.tokutek.com/products/tokudb-for-mysql/

答案 1 :(得分:1)

在分区之前你需要问自己的主要问题是“为什么”。您通过对表格进行分区来实现的目标是什么?

由于所有表的数据仍将存在于单个MySQL服务器上,并且我认为,新行将以“随机”顺序到达(意味着它们将被插入的分区),您将无法获得更多分区。您的点选择查询可能会稍快一些,但不太可能。

我使用MySQL分区看到的主要好处是需要根据设置的保留策略清除的数据。按周或按月对数据进行分区可以很容易地快速删除旧数据。

我觉得你更希望将数据分片(在许多服务器上传播),而且由于你所显示的数据设计实际上只是键值,所以我建议你查看包含分片的数据库解决方案作为一个特色。

答案 2 :(得分:0)

我在这里提出了两个答案,因为它们都有用。 @bbozo - 计划迁移到TokuDB,但有些限制阻止它立即生成。

我想按照我原本想要的方式对uidlist表进行分区。但是,为了让任何人在尝试做类似事情的同时找到这个主题的好处是“如何”

DROP TABLE IF EXISTS `uidlist`;
CREATE TABLE IF NOT EXISTS `uidlist` (
`uid` varchar(9) CHARACTER SET ascii COLLATE ascii_bin NOT NULL ,
`chcs` varchar(16) NOT NULL DEFAULT '',
UNIQUE KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii

PARTITION BY RANGE COLUMNS(uid)
(
 PARTITION p0 VALUES LESS THAN('f%'),
 PARTITION p1 VALUES LESS THAN('k%'),
 PARTITION p2 VALUES LESS THAN('p%'),
 PARTITION p3 VALUES LESS THAN('u%')
);

创建了四个分区。

我怀疑这里的长期解决方案是使用@tmcallaghan建议的键值存储,而不是将所有内容都填充到MySQL表中。一旦我确定了实现这一目标的正确方法,我可能会在适当的时候回复。