我在几百万行的大表上进行分区时遇到问题。
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 :(得分: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
(例如通过框架),那么我不知道,因为主键或唯一索引“必须包括表格分区函数中的所有列”...... < / p>