唯一键,INSERT IGNORE和表分区

时间:2013-12-30 13:23:02

标签: php mysql sql partitioning database-partitioning

所以我有一张桌子:

CREATE TABLE `slots` (
 `customerid` int(11) NOT NULL,
 `orderid` int(11) NOT NULL,
 `queueid` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(3) NOT NULL,
 `variable1` int(3) NOT NULL,
 `variable2` int(3) NOT NULL,
 `variable3` int(3) NOT NULL,
 `variable4` int(3) NOT NULL,
 `variable5` int(3) NOT NULL,
 `variable6` int(3) NOT NULL,
 `variable7` tinyint(1) NOT NULL,
 `variable8` tinyint(1) NOT NULL,
 `variable9` tinyint(1) NOT NULL,
 PRIMARY `queueid` (`queueid`),
 UNIQUE KEY (`customerid`,`orderid`),
 KEY `orderid` (`orderid`)
) ENGINE=InnoDB AUTO_INCREMENT=25883472 DEFAULT CHARSET=latin1

我想通过customerid进行水平分区。问题是customerid和orderid必须形成一个独特的组合 - >我为此创建了一个唯一的密钥,并使用INSERT IGNORE忽略会导致重复行的插入。

这仍然适用于分区表吗?或者它对我的插入速度没有帮助(我正在对表进行分区以实现更高的INSERT速度,但我仍需要注意不要多次插入一行)。

2 个答案:

答案 0 :(得分:2)

在这种情况下,如果您想基于customerId& amp;还想在customerId&上保留独特的钥匙订单ID

将customerId添加到您的PK

MySQL doc says

every unique key on the table must use every column in the table's partitioning expression. (This also includes the table's primary key, since it is by definition a unique key.

所以customerId应该是UNIQUE KEY和PRIMARY KEY的一部分。

答案 1 :(得分:1)

The partitioning docs有这个说法;

  

分区表的分区表达式中使用的所有列必须是表可能具有的每个唯一键的一部分。

换句话说,只要您在customeridorderid或两者上进行分区,它就会有效,否则您的唯一密钥无效。