2012-10-15 66 views
1

我在使用几百万行的大型表上创建分区时出现问题。使用Md5唯一密钥对表进行分区的表Mysql

CREATE TABLE `searcheg`.`pages` (
    `urlId` int(9) NOT NULL AUTO_INCREMENT, 
    `url` varchar(1024) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
    `urlhash` binary(16) NOT NULL,<< MD5 unhex. 
    PRIMARY KEY (`urlId`), 
    UNIQUE KEY `urlhash` (`urlhash`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

如何对此进行分区? urlhash必须是唯一的,因为我需要插入大量的行并检查重复。由于分区必须包含所有唯一列,并且不能为非整数值。分区的一个原因是将.ibd缩小为更易于管理的大小,因为它增长超过50G,我想分割它们。 作为主键的urlID是为了防止每次插入行时重新排序。 urlhash是唯一的以防止重复输入。 我正在寻找一些方法来拆分表而不必删除主键。

+0

我不会使用md5进行分区,因为它是一个非常强大但缓慢的哈希函数。这是为了不同的目的。 – usr

回答

0

如果您使用的是MySQL v5.5,那么您可以使用新的PARTITION BY RANGE COLUMNS选项。 如果你可以删除冗余urlID列,并定义usrhash作为主键,那么你的表定义可能看起来像:

CREATE TABLE pages (
    url VARCHAR(1024) NOT NULL, 
    urlhash BINARY(16) NOT NULL, 
    PRIMARY KEY (urlhash) 
) 
PARTITION BY RANGE COLUMNS (urlhash) (
    PARTITION p0 VALUES LESS THAN ('j'), 
    PARTITION p1 VALUES LESS THAN ('r'), -- split in as many ranges as you wish 
    PARTITION p2 VALUES LESS THAN (MAXVALUE) 
) ; 

万一urlID要求(例如,通过一个框架),那么我不不知道,因为主键或唯一索引“必须包括表的分区函数中的所有列”...