Você não deseja um gen_clust_index gigantesco (Índice Interno de Cluster). Esse tamanho é incrivelmente grande mesmo para um índice secundário.
Pode ser necessário recorrer a gatilhos ou procedimentos armazenados para verificar a chave com bastante antecedência.
Você também pode pensar em executar uma chamada de função SHA1 usando o VARCHAR(3071)
campo SHA1 retornará um campo de 40 caracteres. Esse hash pode ser exatamente o que você precisa indexar.
Suponha que você tenha isso
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
e você deseja criar um UNIQUE
índice em txt. Experimente a abordagem 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;
Então, conte-os
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Se a contagem é a mesma, PARABÉNS !!! Agora você tem um índice exclusivo de comprimento 40. Você pode terminar com:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Isso pode ser mais atomicamente, conforme apontado nos comentários abaixo:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Faça isso em qualquer tabela que você pretenda ter nesta grande coluna. Você deve se lembrar de adicionar o SHA1 dos dados junto com os dados INSERT
.
As chances de chaves duplicadas são de 1 em 2 à potência 160 (1,4650503737309029182036848327163e + 48). Se eu conseguir o valor exato, publicarei algum dia).
De uma chance !!!