如何使用主键和唯一索引(即varchar)对mysql中的表进行分区?

时间:2015-07-16 06:50:32

标签: mysql partitioning

我使用mysql 5.6 我有一个包含auto_increment primary keyunique列的表,其中包含十六进制值。 唯一列用于确保不允许将重复项插入表中。

CREATE TABLE `my_table` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `hexvalue` VARCHAR(32) NOT NULL DEFAULT '',
  `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `hexvalue` (`hexvalue`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我尝试分区时说

ALTER TABLE `my_table` PARTITION BY HASH ( id + hexvalue) PARTITIONS 10;
ERROR 1491 (HY000): The PARTITION function returns the wrong type

由于hexvaluevarchar,当我尝试使用CONV()函数将十六进制值转换为十进制时,它无法返回一个整数值

The patition function is not allowed

P.s: - 我还检查了http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-functions.html

我可以破解这个表吗?

1 个答案:

答案 0 :(得分:0)

首先,我必须质疑你对PARTITION表的需要。其次,我必须指出,我听说HASH分区没有用处。

如果您有UNIQUE列,则可能应该使用PRIMARY KEY代替人工AUTO_INCREMENT。好吧,你会(有效地)认为它是“长”的。如果它是真正的十六进制,则将其打包成二进制并使用BINARY(16)。现在它只有16个字节,而不是32个字节;这更接近INT的4个字节。请参阅HEX()UNHEX()

由于您似乎没有其他辅助密钥,因此PK的大小与此无关。也许您从其他表中引用id,他们必须更改为BINARY(16)

除了3列之外,此表中没有其他内容吗?似乎很奇怪。我问,因为经常正确的架构建议需要更多地了解表,它的列,SELECTs等。