Уникальный ключ, INSERT IGNORE и разбиение таблицы

Итак, у меня есть таблица:

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 и orderid должны образовывать уникальную комбинацию -> я создал уникальный ключ для этого и использую INSERT IGNORE, чтобы игнорировать вставки, которые приводят к дублированию строки.

Будет ли это работать с секционированной таблицей? Или это не помогло бы с моей скоростью вставки (я делю таблицу для достижения более высокой скорости INSERT, но мне все еще нужно следить, чтобы не вставлять одну строку несколько раз).

2 ответа

Решение

В документации по разделам есть, что сказать;

Все столбцы, используемые в выражении секционирования для секционированной таблицы, должны быть частью каждого уникального ключа, который может иметь эта таблица.

Другими словами, это будет работать до тех пор, пока вы customerid, orderid или оба, иначе ваш уникальный ключ недействителен.

В этом случае, если вы хотите разделить на основе customerId, а также сохранить UNIQUE KEY на customerId & orderId

Добавить customerId к вашему ПК

MySQL док говорит

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.

Другие вопросы по тегам