2012-08-01 115 views
7

让我们有一个简单的产品表。每个产品都有其独特的ID和类别。用户经常按类别搜索,因此我想按类别对产品进行分区。一个分区中的每个类别如何按不在唯一索引中的列对MySQL表进行分区

我该怎么做?因为我当然在我的ID列上有一个主键,并且需要我的唯一ID。在每个类别中不是唯一的。

但是partitiong有这样的限制:“表上的每个唯一键必须使用表的分区表达式中的每一列”。

那么,这不会使分区有点没用?或者我错过了什么?我该怎么办?

http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

回答

10

诀窍是外地category添加到您当前的主键。 (您的主键将保持为主键)
然后您可以按类别对表进行分区。

这里是你可以使用代码:

ALTER TABLE `products` DROP PRIMARY KEY , ADD PRIMARY KEY (`id` , `category`); 
ALTER TABLE `products` PARTITION BY KEY(category) PARTITIONS 6; 

添加auto_increment选项标识,如果你希望它是真正独一无二的,当你在表中插入数据不指定id的值。插入时,数据库服务器将确定该id。

如有必要,更改字段名称和密钥名称。

文档:然后
Partitioning types
KEY Partioning

+0

当然,但ID不会是唯一的,但在类只有唯一的,这是我不想要的。 Replace Into将停止工作。如果产品类别改变,产品将被复制。但无论如何,谢谢你的回答。 – 2012-08-02 07:57:59

+0

不可以。将字段添加到主键无法使其成为non_unique,正如我在答案中所写的那样。你为什么不试试看它的工作原理?我已经在一个大的日志表(2百万到5百万条记录)上使用了这种分区方法:白天允许非常快速的SELECT,并且可以非常快速地删除特定日期的所有记录(只需删除一个分区)。 – Jocelyn 2012-08-02 08:49:53

+0

哦,不,我知道PRIMARY KEY仍然是唯一的。但是现在仅仅是密钥的一部分的ID将不再是唯一的,因为类别列中的不同值可以使密钥唯一,尽管ID将是相同的。但它看起来像MySQL就这样工作(虽然它没有多大意义),我将不得不忍受它。无论如何,感谢你的努力。 – 2012-08-03 08:52:13

相关问题