Вам не нужен гигантский gen_clust_index (внутренний кластерный индекс). Этот размер безбожно огромен даже для вторичного индекса.
Возможно, вам придется прибегнуть к триггерам или хранимым процедурам, чтобы заранее проверить ключ.
Вы также можете подумать о выполнении вызова функции SHA1, используя VARCHAR(3071)
поле. SHA1 вернет поле из 40 символов. Этот хеш может быть именно тем, что вам нужно индексировать.
Предположим, у вас есть это
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
и вы хотите сделать UNIQUE
индекс на TXT. Попробуйте подход SHA1
CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytable ADD txtsha1 CHAR(40);
ALTER TABLE mytable ADD UNIQUE KEY (txtsha1);
INSERT INTO mytablenew (id,txt,txtsha1)
SELECT id,txt,SHA1(txt) FROM mytable;
Затем посчитайте их
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Если количество совпадений, ПОЗДРАВЛЯЕМ !!! Теперь у вас есть уникальный индекс длины 40. Вы можете закончить с:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Это может быть более атомарно, как указано в комментариях ниже:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Выполните это на любой таблице, в которой вы собираетесь разместить этот большой столбец. Вы должны не забыть добавить SHA1 данных вместе с данными на INSERT
.
Вероятность дублирования ключей составляет 1 к 2 к 160-й степени (это 1.4615016373309029182036848327163e + 48. Если я получу точную цифру, я опубликую ее когда-нибудь).
Попробуйте!